为什么我的对象在我明确定义时尝试打印时未定义?

时间:2013-06-22 16:12:17

标签: javascript

我目前正在使用Javascript进行Codeacdemy教程,在进行对象教程时,我发现以下内容未定义:

    // Our Person constructor
function Person (name, age){
    this.name = name;
    this.age = age;
}

// Now we can make an array of people
var family = [];
family[0] = Person("alice", 40);
family[1] = Person("bob", 42);
family[2] = Person("michelle", 8);
family[3] = Person("timmy", 6);

// loop through our new array
for(var person in family){
    console.log("name: "+person.name);
}

之前我遇到过codecademy的问题,所以我在自己的网页上尝试过,但仍然未定义。任何人都可以向我解释原因。我也尝试过使用family[0].name,这也是未定义的

5 个答案:

答案 0 :(得分:4)

for-in循环返回索引,而不是值。如果您将其更改为console.log("name: "+family[person].name),它将按预期工作。

for(var person in family){
    console.log(person);
    console.log("name: "+person.name);
}
0
name: undefined
1
name: undefined
2
name: undefined
3
name: undefined

正如@basilikum所提到的,您需要使用new关键字创建每个人,否则他们将不会成为对象。

console.log(Person("alice", 40));     // undefined
console.log(new Person("alice", 40)); // Person {name: "alice", age: 40}

答案 1 :(得分:2)

使用.push()动态添加新的数组成员,因此请替换以下代码:

family[0] = Person("alice", 40);

这个:

family.push( Person("alice", 40) );

答案 2 :(得分:2)

您需要使用new关键字创建对象:

family[0] = new Person("alice", 40);

Person只是一个功能。如果你调用它,你会收到此函数返回的任何内容。由于它不返回任何内容,因此所有条目都是未定义的。通过使用new,您将此函数称为构造函数,它使用您定义的属性创建一个新对象并返回该对象。

正如SpenserJ所说,你还必须记住,for循环只返回键而不是实际的对象。

答案 3 :(得分:1)

JavaScript中的foreach循环提供数组键而不是值。使用family[person].name代替person.name,代码应该有效。

修改:new创作中似乎也缺少Person关键字。

答案 4 :(得分:0)

所以,我在代码学院练习中尝试了 family [person] .name ,但它没有用。

关于代码学院的事情是,他们正在寻找一个答案,具体到他们教你到目前为止。我的bf是sr。软件工程师和.push大头钉将完全适用于日常编码世界!但他们还没有告诉我们。所以,当我把它插入代码学院时仍然没有让我通过。大声笑。

相反,我这样做了:

var family = new Array();
family[0] = new Person("alice", 40);
family[1] = new Person("bob", 42);
family[2] = new Person("michelle", 8);
family[3] = new Person("timmy", 6);


     for ( i = 0; i < family[4] ; i++ );

        console.log(family[0].name);
        console.log(family[1].name);
        console.log(family[2].name);
        console.log(family[3].name);

它有效......我确信还有其他方法(希望更短)来做到这一点......