我想创建一个对象来保存一堆属性,比如
var o = {x: 20, y: 40, color: 'red'};
可以在对象的整个生命周期中添加更多属性,因此我想要一种通用的方法来循环遍历属性以便稍后设置它们。我知道Object.prototype
是否被搞砸了,只是
for(var prop in o) { ... }
将导致其属性也被循环。还有什么其他因素会导致这种情况陷入困境,最安全的循环方式是什么?
答案 0 :(得分:7)
如果要迭代对象上的所有属性,那么继承的属性是您必须处理的唯一真正的问题。 The Object.prototype.hasOwnProperty()
method可用于确认属性直接存在于对象中,而不仅仅是继承属性。
Object.prototype.example = 2;
var o = {x: 4, y: 6};
for (var prop in o) {
if (Object.prototype.hasOwnProperty.call(o, prop)) {
console.log(o[prop]);
}
}
这将打印对象本身的所有属性,但不会打印继承的.example
。
答案 1 :(得分:5)
作为@Jeremy Banks建议的替代方法,Object.keys
方法也只返回对象的“自己的”属性名称。因此,ES5解决方案:
var o = { x: 20, y: 40, color: 'red' };
Object.keys(o).forEach(function (prop) { /* ... */ });
答案 2 :(得分:1)
使用object.hasOwnProperty()
var buz = {
fog: 'stack'
};
for (var name in buz) {
if (buz.hasOwnProperty(name)) {
alert("this is fog (" + name + ") for sure. Value: " + buz[name]);
}
else {
alert(name); // toString or something else
}
}