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