for ... in循环中的继承非枚举属性(JavaScript)

时间:2012-12-05 01:30:06

标签: javascript internet-explorer firefox google-chrome

我有一个对象 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/

2 个答案:

答案 0 :(得分:5)

根据this,它肯定是chrome和ie9中的一个错误。强调我的。

  

枚举对象的属性包括枚举   它的原型的属性,原型的原型,和   等等,递归地; 但是如果没有枚举原型的属性   它是“阴影”因为原型链中的某些先前对象   有一个同名的财产。 [[可枚举]]的值   在确定a的属性时不考虑属性   原型对象被原型上的前一个对象遮蔽   链

答案 1 :(得分:3)

这是V8中的已知错误。很长一段时间以来一直有关于此的错误报告。

Issue 705: Non-enumerable property fails to shadow inherited enumerable property from for-in