我试图用一个函数来扩展 Javascript 的对象类型,该函数检索属于该对象的所有属性名称(基本上是 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());
当变量 b
被提醒时,我期待看到 ["a","b","c","d"]
,但我'我看到 ["a","b","c","d","keys"]
。
for-in 循环似乎包括原型(prototype)化的 keys()
函数。
是否可以在制作原型(prototype)的同时避免这种行为,或者我应该避免一起制作原型(prototype)?
最佳答案
啊,扩展内置插件的乐趣。 for..in
检查被迭代对象的整个原型(prototype)链。
您需要的(我相信现在这是事实上的)是检查 hasOwnProperty
在你的循环中:
for (var property in this) {
if (this.hasOwnProperty(property)) {
a.push(property);
}
}
hasOwnProperty
确保您只获得直接在您的对象上定义的属性(即不在原型(prototype)链上)。
关于Javascript 自定义 Array.prototype 干扰 for-in 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1529593/