2015-11-29 238 views
0

首先,我在很多地方都搜索过这个,但是找不到合适的答案,但我也意识到这可能只是我的失败。Object.create vs新继承混淆

这有做与“新”创建的对象VS的Object.create()

背景:当使用创建对象的“新”,我得到一个对象,它是原来的副本是充满了原始的属性,但是它是自己的东西。但是,当我使用“Object.create()”创建一个对象时,我得到一个新的对象,它似乎只是指向指定的原型。在新对象中指定值时,这似乎不成问题,因为在新对象内创建了新值。但是,当我将关键值对放入新创建的对象中时,它只影响新对象;然而,如果我用Object.create()创建的对象做同样的事情,它会更改原型,并且共享该原型的所有对象都会受到影响。

问题: 这是正确的行为还是我做错了什么?直觉上,我希望创建的方法,无论任何新对象是独立的“个人”,并分别多变,除非我明确地改变了样机,但是这似乎并不符合的Object.create()

怎么会发生什么我可以使用Object.create()来创建原型的独特实例,并在不影响原型的情况下影响对象吗?或者我应该只是接受这不是Object.create()的行为,而是使用构造函数呢?

下面是一些代码为例:

function NewThing(){ 
this.testVal = 35; 
this.testString = "Default"; 
this.testObj = {}; 
} 

thing={ 
testVal: 35, 
testString: "Default2", 
testObj: {} 
} 

test1 = new NewThing() 
    //test1 becomes a new Object with all the properties of NewThing 

test2 = Object.create(thing) 
    // test2 becomes an object that seems to point to the thing object 

test3 = Object.create(thing) 
    // test3 becomes an object that also seems to point to the thing object 

test1.testVal = 45 
    //testVal property of test1 seems changed fine 

test2.testVal = 45 
    //testVal property of test2 seems changed and NOT test 3 which is good 

test1.testObj["test"]="is fine" 
    //puts the pair in the object of test1 

test2.testObj["test"]="is NOT fine" 
    //puts the pair in the PROTOTYPE affecting BOTH test2 and test3 
+0

“*当使用创建对象的‘新’,我得到一个对象,它填充了性能的原件及复印件的原始*“ - 呃,不。原件没有任何属性。构造函数是一个*函数*,它*运行*来初始化该对象,并*在该实例上专门创建*这些属性。使用Object.create创建对象后,您可以使用普通函数完成相同的操作。 – Bergi

+0

不确定是否重复或只有帮助,但看看[继承使用Object.create'的好处](http://stackoverflow.com/a/17393153/1048572)和[Prototypal继承 - 嵌套问题对象](http://stackoverflow.com/q/10131052/1048572) – Bergi

+0

@Bergi感谢您的更正。你是对的。 但是,我仍然需要了解用不同方法创建的新对象中的对象的情况。感谢您的链接。我会很快阅读它们。 – Newb1

回答

0

NewThingtestObj在每次调用创建新的对象。

随着Object.create,由于您没有分配到testObj,那么您正在更改由testObj引用的共享对象。

这是因为如果你使用的NewThing共享对象:

​​