为什么不能在循环中使用点表示法访问对象属性?
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);
这会产生此输出:
看哪!神枪手,未定义的重量!
看哪! Pokepistol,有不确定的重量!
但是,如果我将gun.heft
更改为guns[gun].heft
,我会得到正确的输出。
看哪!神枪手,有上手的重量! 看哪! Pokepistol,肩膀有重量!
似乎我可以在循环中获取枪的名称,但是我不能调用它上面的方法以获得重要性。为什么呢?
在Ruby中,在循环内部,索引处的当前项通常是一个对象。不是吗?
答案 0 :(得分: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
来访问枪的heft
属性。
我的博客上的这篇文章中有更多内容:Mythical Methods
答案 1 :(得分:1)
当您使用for-each循环浏览对象时,必须使用guns[gun]
来访问所述对象,假设您的对象是guns
并且您正在循环访问找到gun
。
答案 2 :(得分:1)
gun
这里是你的循环的索引。尝试:
function listGuns(guns) {
for ( var gun in guns ) {
console.log("Behold! " + gun + ", with " + guns[gun].heft + " heft!");
}
}
答案 3 :(得分:1)
由于你将循环与Ruby相关联,我将展示比较:
JS:
for (gun in guns)
类似于Ruby:
guns.keys.each do |gun|
在这两种情况下,gun
都设置为属性 name ,而不是属性 value 。要获得相应的值,您必须以两种语言访问guns[gun]
。
在Ruby中,您可能会将循环编写为:
guns.each do |gunname, gun|
以便您可以直接访问gun
对象的属性。 Javascript没有内置此操作,但它只是编写一个执行此操作的函数。
答案 4 :(得分:1)
gun.heft
在for-in
循环内不起作用,因为gun
是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]
可以正常工作,因为for-in
处的值是一个对象。
希望它能帮助您了解更多信息。 Click Here了解有关{{1}}循环的更多信息。