2014-01-15 6 views
1

Почему вы не можете получить доступ к объекту с помощью точечной нотации внутри цикла?Методы вызова объектов внутри цикла

var rockSpearguns = { 
    Sharpshooter: {barbs: 2, weight: 10, heft: "overhand"}, 
    Pokepistol: {barbs: 4, weight: 8, heft: "shoulder"} 
}; 
function listGuns(guns) { 
    for (var gun in guns) { 
    console.log("Behold! " + gun + ", with " + gun.heft + " heft!"); 
    } 
} 
listGuns(rockSpearguns); 

Это производит этот выход:

: вот! Стрелок, с неопределенным весом!
Вот! Покепистол, с неопределенным весом!

Но, если я меняю gun.heft на guns[gun].heft, я получаю правильный выход.

Вот! Стрелок, с перевернутым ударом!
Вот! Покепистол, с плечом!

Кажется, что я могу получить имя пушки внутри цикла, но я не могу вызова метода на нем, чтобы получить поднимание. Зачем?

В, скажем Руби, внутри цикла, текущий элемент в индексе обычно является объектом. Нет, так здесь?

+0

Вы пытаетесь получить свойство строки, а не объект, к которому он привязан. – Barmar

+0

И ответ: прочитайте руководство по фригину. Так работает JavaScript. –

+1

Проверьте этот вопрос для получения информации о правильном способе получения цикла for-each в js: http://stackoverflow.com/questions/9329446/for-each-in-an-array-how-to-do-that -in-javascript – vbo

ответ

1

Когда вы навигацию по объекту с по-каждым циклом, вы должны использовать guns[gun] для доступа указанного объекта, предполагая, что вы объект guns и вы циклически найти gun.

1

gun здесь будет указатель вашего цикла. Попробуйте:

function listGuns(guns) { 
    for (var gun in guns) { 
    console.log("Behold! " + gun + ", with " + guns[gun].heft + " heft!"); 
    } 
} 
+0

Его вопрос уже говорит о том, что 'guns [gun] .heft' работает. – Barmar

2

Но, если я изменю gun.heft к guns[gun].heft, я получаю правильный вывод.

...

Кажется, что я может получить имя пушки внутри цикла, но я не могу вызова метода на нем, чтобы получить поднимание. Зачем?

В вашем вопросе нет кода, пытающегося использовать метод на объектах. Если бы не было, она будет работать по той же причине, что guns[gun].heft работы:

// The function we'll make a method 
function getGunHeft() { 
    return this.heft; 
} 

// Create the objects with that function on them as a method 
var rockSpearguns = { 
    Sharpshooter: {barbs: 2, weight: 10, heft: "overhand", getHeft: getGunHeft}, 
    Pokepistol: {barbs: 4, weight: 8, heft: "shoulder", getHeft: getGunHeft} 
}; 

// Use the method 
function listGuns(guns) { 
    for (var gun in guns) { 
    console.log("Behold! " + gun + ", with " + guns[gun].getHeft(); + " heft!"); 
    } 
} 
listGuns(rockSpearguns); 

«Методы» в JavaScript просто функции, присоединенные к свойствам объектов (либо непосредственно, как описано выше, или через лежащего в основе «прототипа» объекта объект). Поэтому, если вы можете получить доступ к свойству объекта, вы можете вызвать функцию, на которую он ссылается.

Когда вы вызываете функцию как часть того же выражения, где вы получаете функцию из свойства объекта, механизм JavaScript устанавливает this, чтобы ссылаться на объект во время вызова функции. Вот почему я использовал this.heft выше, чтобы получить доступ к свойству пистолета .

Еще в этой статье на моем блоге: Mythical Methods

1

Поскольку вы связывающая петлю на Ruby, я покажу сравнение:

JS:

for (gun in guns) 

аналогичный Рубль:

guns.keys.each do |gun| 

В обоих случаях gun установлен в имущество имя, а не имущество значение. Чтобы получить соответствующее значение, вам необходимо получить доступ к guns[gun] на обоих языках.

В Ruby вы бы, вероятно, написать цикл, как:

guns.each do |gunname, gun| 

, так что вы можете получить доступ свойства gun объекта непосредственно. В Javascript не встроена эта операция, а просто написать функцию, которая это делает.

1

gun.heft не работает в цикле, так как for-ingun является локальным переменным внутри for-in цикла, который имеет string типа и заполнитель для ключа объекта итерированного.

var guns = { 
    Sharpshooter: {barbs: 2, weight: 10, heft: "overhand"}, 
    Pokepistol: {barbs: 4, weight: 8, heft: "shoulder"} 
}; 
for(var gun in guns){ 
    console.log(typeof(gun)) 
} 

# print string two times 

Следовательно, вам нужно использовать guns[gun] для доступа к значению конкретного пистолета. И, guns[gun].heft будет работать, поскольку значение в guns[gun] - это объект.

Надеюсь, что это поможет вам понять больше. Click Here узнать больше о for-in петля.

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