4 回答
TA贡献1799条经验 获得超9个赞
for..in迭代原型链上任何位置的所有可枚举属性。如果你想使它trigger不可枚举,所以它不会被迭代for..in,Object.defineProperty而是使用,这使得默认情况下定义的属性不可枚举:
Object.defineProperty(Object.prototype, 'trigger', { value: function() {
}});
var obj = { 4: 15, 10 : 41 }
for( item in obj ) {
console.log(item);
}
TA贡献1795条经验 获得超7个赞
for...in 遍历所有对象属性而不区分对象本身或其任何祖先的属性。
为了仅查看对象本身定义的属性,您可以使用Object.prototype.hasOwnProperty:
const obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }
for( item in obj ) {
if(obj.hasOwnProperty(item) {
foo( obj[item] );
}
}
// will ignore the trigger func and everything else defined on any prototype
TA贡献1934条经验 获得超2个赞
另一种方法是使用Object.keys:
Object.prototype.trigger = function() {
return this;
};
var obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }
Object.keys(obj).forEach(function(item) {
console.log( "Key: " + item + ", value: " + obj[item] );
});
TA贡献2037条经验 获得超6个赞
这是我不久前遇到的一个错误。因为数组也是对象,你可以迭代到原型,不要for..in
用于数组。您的示例特定于导致此问题的对象。相反,使用标准for
来迭代对象的项目。这样,您可以为要实现的目标实现更清晰,更安全的实现,而不是使用主要用于实现反射的defineProperty或hasOwnProperty。
for (var i = 0; i < Object.values(obj).length; i++){ console.log(i + ': ' + Object.values(obj)[i]); //foo( Object.values(obj)[i] );}
添加回答
举报