【问题标题】:Property shadowed by unenumerable property listed?被列出的不可枚举属性遮蔽的属性?
【发布时间】:2012-07-26 05:35:29
【问题描述】:

我想知道以下内容。 给出此代码:

function displayprops(obj, name) {
    console.log(name+":");
    for(var prop in obj)
        console.log(prop + ": " + obj[prop]);
}

var first = {prop: {}};
displayprops(first, "first"); // "prop: [object Object]"

var second = Object.create(first);
Object.defineProperty(second,"prop",{
     enumerable:false
});
displayprops(second, "second"); // "prop: undefined"

(Demo at jsbin)

first 创建的所有对象显然应该继承 prop 财产。

但是为什么从second 创建的对象在迭代它时仍然在其属性中显示prop,请注意它的值是undefined

我希望在将可枚举描述符设置为 false 时,从该原型继承的对象不应再显示这些属性

编辑: 当我用一种方法扩展 Object.prototype (无论出于何种原因) 并将方法可枚举描述符设置为 false 它的行为符合预期

有人可以解释一下吗,也许我想错了方向

谢谢你的答案=)

【问题讨论】:

  • 在说明中,我只想说明一下,给定名称“proto”和(错误的)用法“proto”(假设您自己没有将两者混合) 可能会引起很多混乱,我建议将其命名为不太混乱的名称。另外,请注意,原型是构造函数的方法(Object.prototype 是构造新对象的函数 Object() 的方法(使用 new Object() 或简单的 {})您仅使用 Object.create 创建基于对象的继承创建对象的扩展。
  • 无法复制。 this much simpler code 怎么样,它是否对您显示相同的行为(或者我的抽象错误)?
  • 是的,它表现出相同的行为(至少在使用 Chrome 时)我第一次在钛合金中注意到这种行为
  • 好的,我已经把你的问题简化了很多。
  • @BenjaminGruenbaum Thx 注意到这一点,关键是在我的代码中我使用它例如:JSBin 具有继承和私有变量,我只是在 JSBin 上以类似的方式写下来模式,因为我注意到了其中的行为,所以此刻我没有想到一个更简单的例子。

标签: javascript inheritance prototype


【解决方案1】:

这是 V8 JavaScript 引擎中的一个错误。我以前遇到过。即使被不可枚举的属性遮蔽,原型链中的可枚举属性也包括在内。

已经有一个错误报告。 如果我能找到它,我会在这里发布。在这里......

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

在 Firefox 中测试,你会得到预期的结果。

【讨论】:

  • Thx =) 这似乎是问题所在,嗯,现在我只需要获得钛才能使用其他 javascript 引擎^^
  • @Glutamat:你能告诉我们你需要这种行为的用例吗?只是好奇。
  • 当然,我可以在 iphone 上托管示例的资源文件夹以及编译结果的一些图像,我会在星期一这样做我周末没有时间现在很着急
  • @Bergi TinyUpload 你去吧,我刚刚归档了一个示例中的 js 文件和 2 个图像,(table.js -> 第 149 和 437 行)是设置对象和可枚举的位置设置为 false(与钛和 ios 一起使用)
猜你喜欢
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2011-01-08
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多