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与PHPforeach
@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