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 枚举。