Javascript自定义Array.prototype干扰for-in循环

Lac*_*cD. 3 javascript

我试图用一个函数来扩展Javascript的Object类型,该函数检索属于该对象的所有属性名称(基本上是PHP的array_keys()函数对关联数组的作用).

Object.prototype.keys = function() {
    var a = [];
    for (var property in this) {
        a.push(property);
    }
    return a;
};

var a = {a:1,b:2,c:3,d:4};
alert(a.toSource());

var b = a.keys();
alert(b.toSource());
Run Code Online (Sandbox Code Playgroud)

当变量b被警告时,我期待看到["a","b","c","d"],而不是我看到的["a","b","c","d","keys"].

看来for-in循环包括原型keys()函数.

是否有可能在仍然进行原型设计的同时避免这种行为,或者我是否应该避免一起进行原型设计?

Roa*_*rth 13

啊,扩大内置插件的乐趣.for..in检查正在迭代的对象的整个原型链.

你需要什么(我相信这是现在的事实)是hasOwnProperty在你的循环中检查:

for (var property in this) {
    if (this.hasOwnProperty(property)) {
        a.push(property);
    }
}
Run Code Online (Sandbox Code Playgroud)

hasOwnProperty确保您只获得直接在对象上定义的属性(即不是原型链).