我试图用一个函数来扩展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确保您只获得直接在对象上定义的属性(即不是原型链).