循环JavaScript对象的最安全的方法

Dav*_*iov 2 javascript

我想创建一个对象来保存一堆属性

var o = {x: 20, y: 40, color: 'red'};
Run Code Online (Sandbox Code Playgroud)

可以在整个生命周期中将更多属性添加到对象中,因此我想要一种通用的方法来遍历属性以便稍后设置它们.我知道如果Object.prototype已经搞砸了,简直就是这样

for(var prop in o) { ... }
Run Code Online (Sandbox Code Playgroud)

将导致其属性也被循环.还有什么其他因素会导致这种情况变得混乱,最安全的循环方式是什么?

小智 7

如果要迭代对象上的所有属性,那么继承的属性是您必须处理的唯一真正的问题.Object.prototype.hasOwnProperty()方法可用于确认属性直接存在于对象中,并且不仅仅是继承的.

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将打印对象本身的所有属性,但不会打印继承的属性.example.


kat*_*ugh 5

作为@Jeremy Banks建议的替代Object.keys方法,方法也只返回对象的"自己的"属性名称.因此,ES5解决方案:

var o = { x: 20, y: 40, color: 'red' };

Object.keys(o).forEach(function (prop) { /* ... */ });
Run Code Online (Sandbox Code Playgroud)