js 原型对象与for-in 方法枚举的问题
原型属性的[[enumerable]]属性与for-in 的枚举问题
有的时候[[enumerable]]设置成false 时仍然会被for-in 方法枚举到。详细情况如下:
function Person(){};
Person.prototype = {
constructor: Person,
name: "Oliver"
};
var person1 = new Person();
Object.defineProperty(person1,"name",{
enumerable: true
})
for (var x in person1){
console.log(x);
}
这里原型对象存在name 属性,person1 的name 属性enumerable 为true,可以枚举。
function Person(){};
Person.prototype = {
constructor: Person,
name: "Oliver"
};
var person1 = new Person();
Object.defineProperty(person1,"name",{
enumerable: false
})
for (var x in person1){
console.log(x);
}
这里原型对象存在name 属性,person1 的name 属性enumerable 为false,也可以枚举。
function Person(){};
Person.prototype = {
constructor: Person,
};
var person1 = new Person();
Object.defineProperty(person1,"name",{
enumerable: true
})
for (var x in person1){
console.log(x);
}
这里原型对象不存在name 属性,person1 的name 属性enumerable 为true,可以枚举。
function Person(){};
Person.prototype = {
constructor: Person,
};
var person1 = new Person();
Object.defineProperty(person1,"name",{
enumerable: false
})
for (var x in person1){
console.log(x);
}
这里原型对象不存在name 属性,person1 的name 属性enumerable 为false,不可枚举。
综上所述,原型对象和实例如果都存在同名属性,则无论实例中该属性的[[enumerable]]是true 还是false 都可以被for-in 枚举。
另一方面:
function Person(){};
Person.prototype = {
constructor: Person,
name: "Oliver"
};
var person1 = new Person();
Object.defineProperty(Person.prototype,"name",{
enumerable: true
})
for (var x in Person.prototype){
console.log(x);
}
原型对象的属性如果被修改了[[enumerable]],则按照规则返回结果。
function Person(){};
Person.prototype = {
constructor: Person,
};
var person1 = new Person();
Object.defineProperty(Person.prototype,"name",{
enumerable: false
})
for (var x in Person.prototype){
console.log(x);
}
新建立的原型对象的属性[[enumerable]],也是按照规则返回结果。
最后,再重申一遍,如果原型对象合实例存在同名属性,无论如何都会被for-in 枚举。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。