JavaScript:为什么“ for in”循环从__proto__中选择变量?

Ale*_*hul 5 javascript for-loop prototype

trigger在对象原型中添加了一个方法:

Object.prototype.trigger = function() {
    //  ...
    return this;
};
Run Code Online (Sandbox Code Playgroud)

然后有一个“ for in”循环:

var obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }
for( item in obj ) {
    foo( obj[item] );
}
Run Code Online (Sandbox Code Playgroud)

但是此循环有6次迭代,而不是5次。最后一次迭代使用key:

item = "trigger"
Run Code Online (Sandbox Code Playgroud)

为什么循环遍历__proto__对象的一部分?

Cer*_*nce 3

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);
}
Run Code Online (Sandbox Code Playgroud)