Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对循环中的对象调用方法_Javascript_Loops_For Loop - Fatal编程技术网

Javascript 对循环中的对象调用方法

Javascript 对循环中的对象调用方法,javascript,loops,for-loop,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 + ",

为什么不能在循环中使用点符号访问对象属性

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
,我会得到正确的输出

瞧!神枪手,有上手的重量
看到薄皮书,有肩膀的重量

看起来我可以在循环中得到枪的名字,但是我不能调用一个方法来得到它的重量。为什么?


比如说Ruby,在循环中,索引中的当前项通常是一个对象。这里不是吗?

当你在一个对象中导航时,你必须使用
枪[gun]
来访问所述对象,假设你的对象是
,你在循环中找到

,这里是你的循环索引。尝试:

function listGuns(guns) {
  for ( var gun in guns ) {
    console.log("Behold! " + gun + ", with "  + guns[gun].heft + " heft!");
  }
}
但是,如果我将
gun.heft
更改为
guns[gun].heft
,我会得到正确的输出

看起来我可以在循环中得到枪的名字,但是我不能调用一个方法来得到它的重量。为什么?

您的问题中没有试图在对象上使用方法的代码。如果有,它会起作用,原因与
枪[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
属性


在我的博客上的这篇文章中有更多内容:

因为您将循环与Ruby关联,所以我将展示比较:

JS:

与Ruby类似:

guns.keys.each do |gun|
在这两种情况下,
gun
都设置为属性名称,而不是属性值。要获得相应的值,您必须访问两种语言的
guns[gun]

在Ruby中,您可能会将循环编写为:

guns.each do |gunname, gun|

这样您就可以直接访问
gun
对象的属性。Javascript没有内置此操作,但它只是编写一个函数来完成此操作。

gun.heft
for in
循环中不起作用,因为
gun
for in
循环中的局部变量,它是
字符串类型,并且是被迭代对象键的占位符

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
因此,您需要使用
枪[gun]
来访问特定枪的值。 而且,
guns[gun].heft
将起作用,因为
guns[gun]
处的值是一个对象

希望它能帮助你了解更多。
要了解有关in
循环的
的更多信息。

您试图获取字符串的属性,而不是它映射到的对象。答案是:阅读friggin手册。这就是JavaScript的工作原理。查看这个问题,了解如何在js中获得for each循环的正确方法:JavaScript不是Ruby或PHPfor与PHP
foreach
@vbo不同:除了这个问题是关于数组而不是对象。
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