使用 JSON 创建对象的实例



>我正在尝试学习编程。我已经浏览了在线教程网站列表,我被困在我认为对我来说非常重要的事情上。

我的问题:

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

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

从未知的数据条目总数创建对象似乎非常重要。不幸的是,像Codecademy这样的地方在这里做得不够。您始终使用它们为您提供的硬编码名称手动创建对象的新实例。但是,如果有两个同名的人会发生什么?

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

这是控制台屏幕截图的链接 - https://i.stack.imgur.com/uvova.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();

在我的...在循环中,为什么使用"联系人"构造函数创建新的"obj"对象起作用?

变量只是值的保存位置。它不是值本身。如果用新值覆盖变量,则只要某些东西保留对它的引用,它所持有的先前值将继续存在;只是变量将不再引用它。

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

不,你没有。一个变量就可以了,只要在将变量分配给下一个值之前对值执行某些操作即可。

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

你有多少并不重要。

此外,为什么控制台日志中任何对象的标题都没有显示 obj?

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

我是否对创建对象的实例意味着什么感到困惑?

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

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

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

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

i 保存要迭代的对象的属性名称,因此在本例中,字符串"contact1""contact2""contact3" 。这些字符串没有 nameage 属性,因此构造函数接收两个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);
}

最新更新