2015-08-12 2 views
1

Я пытаюсь создать объект, используя мой конструктор Person, но он не работает, когда я инициализирую объект непосредственно в массиве, который использует литерал.Создание объектов с конструктором внутри массива literal

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

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

for (var person in family) { 
    console.log(family[person].name); 
} 

Но это просто печатает undefined четыре раза.

Я должен использовать это обозначение:

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); 

Так печатает alice, bob, michelle, timmy.

Что я делаю неправильно?

+0

Если вы не» t хотите использовать простой цикл 'for', вы можете так же легко выбросить его в' forEach' – Deryck

ответ

2

Вы можете просто использовать это:

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

Существует нет необходимости вмещающих каждый Person в скобках.

Теперь вы можете цикл по элементам вашего массива, как показано ниже:

for (var index=0; index<family.length; index++) { 
    console.log(family[index].name); 
} 

Я не использовал for..in, так как это существует и по другой причине:

инструкции for..in итерирует по перечислимым свойствам объекта в произвольном порядке. Для каждого отдельного свойства могут выполняться операторы .

Для получения дополнительной информации о for...in, пожалуйста, посмотрите here.

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

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

 
for (var index=0; index<family.length; index++) { 
 
    document.write(family[index].name); 
 
    document.write("</br>"); 
 
}

+0

Но не делает ли он код неправильным? Похоже, он должен работать. – Melo

+0

Да, это так, потому что, используя дополнительные скобки, вы определяете массив в своем массиве. Каждый человек встает в массив, и все эти массивы вставляются в массив, называемый семейством. Я не думаю, что это ваше намерение. – Christos

+1

Ваш код работает, но вы ищете свойство «name» в массиве, а не на Person. см. Этот JSBin: http://jsbin.com/doyabi/edit?js,console – Pjetr

1

Вы на самом деле создать 2D массив - Я думаю, что вы хотите только обычный массив, а затем использовать обычный for цикл для перебора:

var family = [ 
    new Person("alice", 40), //omit the inner arrays, etc./. 
]; 

for (var i = 0; i < family.length; i++) { 
    //check em out 
    console.log(family[i].name); 
} 
+0

Почему вы использовали разные 'for'? Тот, который я использовал, не рекомендуется? – Melo

+2

@PedroMelo - Да - синтаксис 'for in', если для итерации над свойствами объекта.У вас есть массив объектов, поэтому используйте регулярный 'for' для массива. – tymeJV

+0

@PedroMelo Вы также можете использовать 'family.forEach (function (person) {console.log (person.name);});' –

Смежные вопросы