【问题标题】:Using JSON to create instances of an object使用 JSON 创建对象的实例
【发布时间】:2015-01-08 20:00:57
【问题描述】:

我正在努力学习编程。我浏览了一系列在线教程网站,但我被困在一个我认为对我来说非常重要的事情上。

我的问题:

  1. (这是我最想了解的) 在我的 for...in 循环中,为什​​么使用“Contacts”构造函数创建新的“obj”对象有效?似乎每次循环时我都需要一个不同的名称,这样我就不会覆盖我之前创建过的对象。如果这是正确的,如果我提前不知道联系人的数量或价值,我该怎么做?另外,为什么控制台日志中任何对象的标题都不是obj?我是否对创建对象实例的含义感到困惑?这些实例的名称不重要吗?

  2. 为什么所有属性都未定义?是否应该从临时“i”变量中引用属性?

从未知的总数据条目中创建对象似乎非常重要。不幸的是,像 Codecademy 这样的地方在这方面做得不够。你总是用他们给你的硬编码名称手动创建对象的新实例。但是如果有两个同名的会怎样呢?

非常感谢您在这方面提供的任何帮助。不要阻止告诉我我可能正在做的其他愚蠢的事情。

这是控制台屏幕截图的链接 - http://i.imgur.com/TK4dtfV.png

var TestApp = {};

// my data... taken from wherever
TestApp.jsonContacts = {
    contact1: {
        name: "Ethan",
        age: 24
    },
    contact2: {
        name: "Evan",
        age: 30
    },
    contact3: {
        name: "Paul",
        age: 9000
    }
};

// I know this is silly, just let me pretend...
TestApp.jsonStrung = JSON.stringify(TestApp.jsonContacts);

TestApp.globalContactList = [];

// my constructor function to create instances of Contact
TestApp.Contact = function(name, age){
    this.name = name;
    this.age = age;
    TestApp.globalContactList.push(this);
};

// where I'm taking data and creating new Contact objects
TestApp.instantiateObjects = function(){
    // I know this is silly, just let me pretend...
    var jsonUnstrung = JSON.parse(TestApp.jsonStrung);
    // I think I'm looping through the first set of objects sitting in jsonContacts
    for (var i in jsonUnstrung) {
        var obj = new TestApp.Contact(i.name, i.age);
        console.log(obj);
    }
    console.log(TestApp.globalContactList);
};

TestApp.instantiateObjects();

【问题讨论】:

    标签: javascript json object new-operator addressbook


    【解决方案1】:

    在我的 for...in 循环中,为什​​么使用“Contacts”构造函数创建新的“obj”对象有效?

    变量只是一个值的存放位置。它不是价值本身。如果你用一个新值覆盖一个变量,只要 something 持有对它的引用,它之前持有的值就会继续存在;只是变量不再引用它。

    似乎每次循环时我都需要一个不同的名称,这样我就不会覆盖我之前创建过的对象。

    不,你没有。一个变量很好,只要在将变量分配给下一个值之前对值进行操作。

    如果这是正确的,如果我事先不知道联系人的数量或价值,我该怎么做?

    你有多少并不重要。

    另外,为什么控制台日志中的任何对象的标题都不是obj?

    console.log() 打印出传递给它的值。它不关心(不知道)您传递给它的变量的任何内容。

    我是否对创建对象实例的含义感到困惑?

    好像是这样。创建对象的实例会分配一些内存来存储该对象的值。变量允许您访问该分配的对象。

    这些实例的名称不重要吗?

    是的,对象实例没有名称。

    为什么所有属性都未定义?

    i 保存您正在迭代的对象的属性名称,因此在本例中,字符串为"contact1"、"contact2"、"contact3"。这些字符串没有name 或age 属性,因此您的构造函数接收到两个undefined 值。

    应该从临时“i”变量中引用属性吗?

    您需要使用i 作为属性名称来访问属性值:

    var obj = new TestApp.Contact(jsonUnstrung[i].name, jsonUnstrung[i].age);
    



    一般来说,最好不要在构造函数中出现像TestApp.globalContactList.push(this); 这样的副作用。在某些情况下这样做是有意义的,但大多数情况下,删除该行并这样做会更好:

    for (var i in jsonUnstrung) {
        var contact = jsonUnstrung[i];
        var obj = new TestApp.Contact(contact.name, contact.age);
        console.log(obj);
        TestApp.globalContactList.push(obj);
    }
    

    【讨论】:

    • 好的...实例化对象后,我应该如何处理这些对象?可能有几种方法可以处理它,但考虑到我只是想学习一种非常强大的方法来做这件事,你会推荐什么?我真的应该把它们推到一个数组中吗?我唯一担心的是,我无法知道将来要引用数组中的哪个对象。您如何建议以有用的方式跟踪索引号和它们引用的对象?或者是否有其他方法可以引用这些实例化对象,以便我可以允许 DOM 事件更改数据?
    • @noob-in-need 抱歉回复晚了。你应该对对象做什么完全取决于你想要做什么。如果没有手头的特定任务,我认为没有任何方法可以说明您的代码应该做什么超出它已经在做的事情。如果您想知道如何处理某些特定情况,可以在此站点上发布一个新问题,很多人会很乐意为您提供帮助。
    猜你喜欢
    • 2017-06-16
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2018-08-15
    • 2012-07-21
    相关资源
    最近更新 更多