在循环内的对象上调用方法

时间:2014-01-15 12:08:31

标签: javascript loops for-loop

为什么不能在循环中使用点表示法访问对象属性?

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中,在循环内部,索引处的当前项通常是一个对象。不是吗?

5 个答案:

答案 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.heftfor-in循环内不起作用,因为gunfor-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}}循环的更多信息。