Javascript 为什么Object.create使我的私有变量是静态的?
此处提供的代码可用于: 这基本上是对私有变量的crockfords解释的直接复制和粘贴 我添加了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
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);