Javascript 为什么Object.create使我的私有变量是静态的?

Javascript 为什么Object.create使我的私有变量是静态的?,javascript,prototype,object-create,Javascript,Prototype,Object Create,此处提供的代码可用于: 这基本上是对私有变量的crockfords解释的直接复制和粘贴 我添加了Object.create()和一些跟踪 为什么第二个对象共享第一个对象的私有成员?如何避免这种情况,但继续使用Object.create() 但实际上第二个对象的输出都是空的 private private private null null null null null 我的结论是,第二个将共享第一个对象的秘密成员。对象。create()和new用于不同的目的 您可以使用Object.crea

此处提供的代码可用于:

这基本上是对私有变量的crockfords解释的直接复制和粘贴

我添加了
Object.create()
和一些跟踪

为什么第二个对象共享第一个对象的私有成员?如何避免这种情况,但继续使用
Object.create()

但实际上第二个对象的输出都是空的

private
private
private
null

null
null
null
null
我的结论是,第二个将共享第一个对象的秘密成员。

对象。create()
new
用于不同的目的

您可以使用
Object.create()
从现有对象继承

使用
new
创建对象的新
实例

有关详细信息,请参见以下问题和答案:

对象。create()
不会运行构造函数。但在您的示例中,构造函数是您的私有魔法发生的地方。相反,
Object.create()
只需创建一个新对象,并将属性复制到该对象上即可


然后,构造函数会创建一个作用域,这个作用域是共享的,因为在该作用域中创建的函数会被复制。克隆实例时,对该范围的访问也是如此。

它们不是静态的,它们是“第一个”对象的实例成员。您从未为“第二个”对象创建过任何新的实例成员,因为您从未调用其构造函数。相反,您将“second”的原型设置为“first”,这意味着无论何时在“second”上访问缺少的属性,您都将从“first”中获得值

您可以在使用Object.create之后调用构造函数,方法如下

Container.call(second, param);

我对您的期望和您在JSFIDLE上看到的东西感到困惑。你能再详细说明一下你不明白的地方吗?-1代表jsfiddle.net(@Ashish Gupta)。为什么不将代码和结果一起粘贴到这里?它不复制属性,而是建立原型链。是的,我想这更准确,但它仍然使特权函数可用于创建的对象。这是最重要的一点。
private
private
private
null

null
null
null
null
Container.call(second, param);