4 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
for..in迭代原型鏈上任何位置的所有可枚舉屬性。如果你想使它trigger不可枚舉,所以它不會(huì)被迭代for..in,Object.defineProperty而是使用,這使得默認(rèn)情況下定義的屬性不可枚舉:
Object.defineProperty(Object.prototype, 'trigger', { value: function() {
}});
var obj = { 4: 15, 10 : 41 }
for( item in obj ) {
console.log(item);
}

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
for...in 遍歷所有對象屬性而不區(qū)分對象本身或其任何祖先的屬性。
為了僅查看對象本身定義的屬性,您可以使用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貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
另一種方法是使用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貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是我不久前遇到的一個(gè)錯(cuò)誤。因?yàn)閿?shù)組也是對象,你可以迭代到原型,不要for..in
用于數(shù)組。您的示例特定于導(dǎo)致此問題的對象。相反,使用標(biāo)準(zhǔn)for
來迭代對象的項(xiàng)目。這樣,您可以為要實(shí)現(xiàn)的目標(biāo)實(shí)現(xiàn)更清晰,更安全的實(shí)現(xiàn),而不是使用主要用于實(shí)現(xiàn)反射的defineProperty或hasOwnProperty。
for (var i = 0; i < Object.values(obj).length; i++){ console.log(i + ': ' + Object.values(obj)[i]); //foo( Object.values(obj)[i] );}
添加回答
舉報(bào)