使用JSON创建对象的实例

时间:2015-01-08 20:00:58

标签: javascript json object new-operator addressbook

我正在努力学习编程。我已经浏览了一系列在线教程网站,而且我认为这对我来说非常重要。

我的问题:

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

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

  3. 从未知的总数据条目中创建对象似乎非常重要。不幸的是,像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();
    

1 个答案:

答案 0 :(得分:5)

  

在我的for ... in循环中,为什​​么要创建新的" 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);
}