我有一个对象 p ,有一个可枚举的 x 。
var p = Object.create(Object.prototype, {
x: {
value: "frog",
enumerable: true
}
});
我创建了一个继承自 p 的对象,并使用非可枚举属性覆盖属性 x
var o = Object.create(p, {
x: {
value: "bird",
enumerable: false
}
});
您如何看待 x 属性是否会在 o 的for ... in循环中枚举?
for (var n in o) {
console.log(n);
}
好吧,在Chrome和IE9中,它将被枚举(我认为,这是非常奇怪的);在FF中,它不会被列举。
哪一个是正确的行为?
以下是一个完整的示例:http://jsfiddle.net/hnvsM/3/
答案 0 :(得分:5)
根据this,它肯定是chrome和ie9中的一个错误。强调我的。
枚举对象的属性包括枚举 它的原型的属性,原型的原型,和 等等,递归地; 但是如果没有枚举原型的属性 它是“阴影”因为原型链中的某些先前对象 有一个同名的财产。 [[可枚举]]的值 在确定a的属性时不考虑属性 原型对象被原型上的前一个对象遮蔽 链
答案 1 :(得分:3)
这是V8中的已知错误。很长一段时间以来一直有关于此的错误报告。
Issue 705: Non-enumerable property fails to shadow inherited enumerable property from for-in