2015-11-29 139 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共享對象:

​​