2016-03-02 100 views
0

我認爲我沒整明白原型流,我有這樣的問題:原型陣列PARAM

function SomeO() {}; 
SomeO.prototype.arr = []; 
SomeO.prototype.str = ""; 

var s1 = new SomeO(); 
var s2 = new SomeO(); 

s1.str+="1" 
console.log(s2) // "" OK 

s1.arr.push(1) 
console.log(s2) // [1] WHY??? 

爲什麼當我將項目添加到一個對象數組具有相同的數組實例?

回答

2

這是因爲對象是通過引用共享你的「SomeO」對象的所有實例,在這種情況下,你的「ARR」屬性,事情就是這樣的價值是共享的字符串或數字,這樣的修改字符串不會影響其他實例的值。

所以在這種情況下是正常的,以獲得該結果。

function SomeO() {}; 
 
SomeO.prototype.arr = []; 
 
SomeO.prototype.str = "chimichangas"; 
 

 
var s1 = new SomeO(); 
 
var s2 = new SomeO(); 
 

 
s1.str+="1" 
 
console.log(s1.str); // "chimichangas1" OK because is by value 
 
console.log(s2.str); // "chimichangas" OK because is by value 
 

 
s1.arr.push(1); 
 
console.log(s2.arr); // [1] WHY??? because is by reference

如果你不想分享你應該做的事情,如陣列。

function SomeO() { 
 
    this.arr = []; 
 
}; 
 
SomeO.prototype.str = ""; 
 

 
var s1 = new SomeO(); 
 
var s2 = new SomeO(); 
 

 
s1.str+="1" 
 
console.log(s1.str); // "1" OK 
 
console.log(s2.str); // "" OK 
 

 
s1.arr.push(1); 
 
console.log(s1.arr); // [1] Ok 
 
console.log(s2.arr); // [] Ok

+0

我明白,但通過將數組初始化構造函數中的是某種mskes整個ptototype概念無關緊要。 –

0

因爲兩個實例共享相同的[[Prototype]](分配給SomeO.prototype的對象),所以它們在SomeO.prototype.arr中也共享相同的數組。

你可以自己去查:

s1.arr === s2.arr 

爲了規避這一點,你可以定義數組(您可能需要的所有其他物體)在構造函數來代替:

function SomeO() { 
    this.arr = []; 
    this.obj = {}; // define all arrays and objects in the constructor if they need to be separate 
} 
0

因爲這是怎麼你定義了這個數組:你在所有實例之間共享的原型上創建了一個數組對象。通常,您只需要在原型上放置函數和常量值。每一個實例屬性需要在構造器中創建:

function SomeO() { 
    this.arr = []; 
} 
0

當你引用一個對象的屬性(如s1.arr),它首先檢查對象上存在的屬性,如果是這樣,它返回它,如果沒有,它會回落到對象的原型。

當你這樣做s1.str += "1",你設置的對象本身的str財產相當於s1.str = s1.str + "1",原型的str屬性不會改變。 s1.str將返回來自s1的新字符串,並且s2.str將回退到prototype.str

  s1's str s2's str prototype's str s1.str   s2.str 
before: -   -   ""    "" (from proto) "" (from proto) 
after: "1"     ""    "1" (from own) "" (from proto) 

當你做你s1.arr.push(1)從原型得到s1.arr,並更改它的值。您從未在s1上設置arr屬性。

  s1's arr s2's arr prototype's arr s1.arr   s2.arr 
before: -   -   []    [] (from proto) [] (from proto) 
after: -   -   [1]    [1] (from proto) [1] (from proto)