细节:js 原型对象与for-in 方法枚举的问题

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

你可能感兴趣的:(javascript)