使用 JSON 创建 object 的实例

Using JSON to create instances of an object

我正在努力学习编程。我已经浏览了一系列在线教程网站,但我坚持了一个我认为对我来说非常重要的事情来理解。

我的问题:

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

  2. 为什么所有属性都未定义?从临时 "i" 变量引用属性应该有效吗?

从未知的数据条目总数创建 objects 似乎非常重要。不幸的是,像 Codecademy 这样的地方在这里不尽如人意。您总是使用他们给您的硬编码名称手动创建 objects 的新实例。但是如果有两个同名会怎样呢?

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

这是控制台屏幕截图的 link - 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();

In my for...in loop, why is creating new "obj" objects using the "Contacts" constructor working?

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

It seems like I would need a different name each time I loop so that I don't overwrite the object that I've created the pass before.

不,你不知道。一个变量就可以了,只要在将变量分配给下一个值之前对值做一些事情。

If this is correct, how do I do this if I don't know anything about the number or value of contacts ahead of time?

拥有多少并不重要。

Additionally, why does the title of the any of the objects in the console logs not say obj?

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

Am I confused about what it means to create an instance of an object?

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

Are the names of these instances unimportant?

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

Why are all of the properties undefined?

i 包含您正在迭代的对象的 属性 名称,因此在本例中,字符串 "contact1""contact2""contact3" .这些字符串没有 nameage 属性,因此您的构造函数接收到两个 undefined 值。

Should referencing properties from the temporary "i" variable work?

您需要使用 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);
}