2012-12-05 125 views
2

我有一个对象p,使用可枚举的索引xfor ... in循环(JavaScript)中的继承的非可枚举属性

var p = Object.create(Object.prototype, { 
    x: { 
    value: "frog", 
    enumerable: true 
    } 
}); 

我创建了一个对象,从p继承,并覆盖属性X,具有不可枚举的属性

var o = Object.create(p, { 
    x: { 
    value: "bird", 
    enumerable: false 
    } 
}); 

你怎么看,将财产X被列举在... for循环中o

for (var n in o) { 
    console.log(n); 
} 

那么,在Chrome和IE9中,它将被枚举(这是我认为,很奇怪);在FF中,它不会被列举。

哪一个是正确的行为?

下面是一个完整的例子:http://jsfiddle.net/hnvsM/3/

回答

5

this,这绝对是在Chrome和IE9的错误。强调我的。

枚举一个对象的属性包括:等枚举其原型 性质,并且原型的原型,和 ,递归; 但是如果 “shadowed”原型的属性未列举,因为原型链 中的某些以前的对象具有同名的属性。 确定 原型对象的属性是否由原型 链上的上一个对象拍摄时,未考虑[[Enumerable]] 属性的值。