Javascript custom Array.prototype干扰for in循环
我试图用一个函数扩展Javascript的对象类型,该函数检索属于该对象的所有属性名(基本上就像PHP的Javascript custom Array.prototype干扰for in循环,javascript,Javascript,我试图用一个函数扩展Javascript的对象类型,该函数检索属于该对象的所有属性名(基本上就像PHP的array\u keys()函数对关联数组所做的那样) 当变量b发出警报时,我希望看到[“a”、“b”、“c”、“d”],而不是看到[“a”、“b”、“c”、“d”、“keys”] for in循环似乎包括原型化的keys()函数 在仍然原型化的情况下,是否有可能避免这种行为,或者我应该一起避免原型化?啊,扩展内置的乐趣for..in检查被迭代对象的整个原型链 你需要的(我相信这是事实上的现在
array\u keys()
函数对关联数组所做的那样)
当变量b
发出警报时,我希望看到[“a”、“b”、“c”、“d”]
,而不是看到[“a”、“b”、“c”、“d”、“keys”]
for in循环似乎包括原型化的keys()
函数
在仍然原型化的情况下,是否有可能避免这种行为,或者我应该一起避免原型化?啊,扩展内置的乐趣
for..in
检查被迭代对象的整个原型链
你需要的(我相信这是事实上的现在)是检查你的循环:
for (var property in this) {
if (this.hasOwnProperty(property)) {
a.push(property);
}
}
hasOwnProperty
确保您只获取直接在对象上定义的属性(即,不在原型链上)。对于大多数情况,您应该避免扩展本机对象。原型
。扩展时,所有对象都将接收这些新属性
Object.defineProperty(Array.prototype, 'foo', {
value: 'bar',
enumerable: false // Defaults to false.
});
const arr = [1,2,3];
for(const k in arr) console.log(k); // 0, 1, 2
console.log(arr.foo); // bar
在对象属性上循环是一项非常常见的任务,正如您所指出的,您遇到了意外的行为
我没有见过很多人总是在他们的代码中使用hasOwnProperty
功能,我想说的是,在“受控环境”下,作为一个项目的独立开发人员,你可以管理这些问题,但是当事情变得更大,你有更多的开发人员参与时,这可能会导致很多问题
在对象上创建一个静态函数怎么样
Object.keys = function(obj) {
var a = [];
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
a.push(property);
}
}
return a;
};
var a = {a:1,b:2,c:3,d:4};
alert(a.toSource());
var b = Object.keys(a);
alert(b.toSource());
这也适用于:
var items = [
{
id: 1, name: 'Item 1'
},
{
id: 2, name: 'Item 2'
},
{
id: 3, name: 'Item 3'
}
];
items.forEach(function(item, index) {
console.log(item);
});
for…in语句遍历由字符串设置键控的对象的所有可枚举属性(忽略由符号设置键控的属性),包括继承的可枚举属性
因此,您可以定义不可枚举的属性
Object.defineProperty(Array.prototype, 'foo', {
value: 'bar',
enumerable: false // Defaults to false.
});
const arr = [1,2,3];
for(const k in arr) console.log(k); // 0, 1, 2
console.log(arr.foo); // bar
仅供参考,
hasOwnProperty
在IE 5.0版之前(5.5版之前)和Safari 2.02版之前不受支持。您可能会认为您不在乎支持这些浏览器,但您应该知道您不在乎。注意:Object.keys
方法已经引入到ECMAScript第5版规范中,并且所有最近的浏览器都实现了它,在声明它之前,我们必须检查该方法是否已经定义。