Javascript 被列出的不可数属性遮蔽的属性?

Javascript 被列出的不可数属性遮蔽的属性?,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,我想知道以下几点。 给出此代码: 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 = Ob

我想知道以下几点。 给出此代码:

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"
()

首先创建的所有对象都应该在
prop
属性

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

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

编辑: 当我用一个方法扩展Object.prototype(无论出于什么原因)时 以及将方法可枚举描述符设置为false 它的行为和预期的一样

有人能解释一下吗?也许我想的方向不对


Thx for the answers=)

这是V8 JavaScript引擎中的一个bug。我以前见过。原型链中的可枚举属性包括在内,即使被不可枚举属性遮挡

已经有关于它的错误报告了。如果我能再找到它,我会把它贴在这里。这是


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

注意,我想说的是,给定名称“proto”和(不好的)用法“proto”(假设你自己没有将两者混合使用)可能会引起很多混乱,我建议将其命名为不那么混乱的名称。另外,请注意prototype是构造函数的一种方法(Object.prototype是函数Object()的一种方法,它构造新对象(使用new Object()或简单地{})。您仅使用Object.create创建基于对象的继承,它创建了一个对象的扩展。无法复制。那么,它会为您显示相同的行为吗(或者我的抽象是错误的)?是的,它显示了相同的行为(至少在使用Chrome时)我第一次在titaniumOK中注意到了这种行为,我已经简化了你的问题。@BenjaminGruenbaum Thx注意到了这一点,重点是在我的代码中,我用它作为例子:拥有继承和私有变量,我只是以类似的模式在JSBin上写下它,因为我注意到了这种行为,我没有注意到现在来看一个更简单的例子。Thx=)这似乎是问题所在,嗯,现在我只需要让titanium使用另一个javascript引擎^^^@glumnat:你能告诉我们你需要这种行为的用例吗?只是好奇。当然我可以在iphone上托管一个示例的resources文件夹以及一些编译结果的图像,我周一会这样做,我在星期一没有时间做周末我很忙,对吗now@Bergi好了,我刚刚归档了一个示例中的js文件和两个图像,(table.js->line 149和437)是设置对象的地方,enumerable设置为false(与Tianium和ios一起使用)