2013-03-09 76 views
0

以下是一些例子。使用Object.create()和使用賦值運算符有什麼區別?

// case 1: 
var obj1 = {msg : 'Hello'}; 
var obj2 = obj1; 
obj2.msg = "Hi!"; //overwrites 
alert(obj1.msg); //=>'Hi!' 

// case 2: 
var obj1 = {msg : 'Hello'}; 
var obj2 = Object.create(obj1); 
obj2.msg = "Hi!"; //does not overwrite 
alert(obj1.msg); //=>'Hello' 

// case 3: 
var obj1 = {data: { msg : 'Hello'}} 
var obj2 = Object.create(obj1); 
obj2.data.msg = "Hi!"; //overwrites, Why? 
alert(obj1.data.msg); //=>'Hi!' 

我覺得Object.create()只是給雙方做都指向相同的原型,而分配使得兩個對象都指向同一個位置(而不僅僅是原型)。 但是爲什麼數據對象在情況3中被覆蓋?

回答

4

var obj2 = Object.create(obj1)以obj1爲原型創建一個空的(!)對象。

obj2.msg = "Hi!"將屬性信息添加(!)到obj2。

obj2.data.msg = "Hi!"在obj2上查找屬性數據,但obj2爲空。所以它尋找obj2原型的屬性數據,這恰好是obj1。然後它將msj上的obj1.data更改爲「Hi」。

5

因爲Object.create()只創建一個淺拷貝,嵌套的對象仍是參考,而不是深複製,見15.2.3.5Object.create())和15.2.2.1new Object())。

如果你想克隆一個對象完全看看How do I correctly clone a JavaScript object?和類似的問題。

+0

要詳細說明這一點,當你設置一個prototype屬性時,如果它是一個簡單的值,比如一個字符串或數字,它將被設置在對象本身而不是原型上,但是如果你「重新修改現有的對象或數組屬性,您將更改原型上的屬性。理解這種區別很重要,因爲它對正確地繼承有影響。請參閱http://www.bennadel.com/blog/1566-Using-Super-Constructors-Is-Critical-In-Prototypal-Inheritance-In-Javascript.htm瞭解更多信息。 – 2013-03-09 08:14:01

0

這是因爲Java腳本設置和檢索屬性的方式而發生的。爲了獲取屬性,它查找原型鏈,同時將它設置爲最本地對象。

在情況2中,爲什麼它沒有覆蓋。它將msg屬性設置爲obj2.In情況3它獲取父對象中的數據對象並在那裏設置屬性。因此它被覆蓋。在情況1他們都指的是同一個對象

相關問題