2016-12-04 94 views
0

我很難理解這一點,甚至在互聯網上摸索。這裏是我在javscript中的代碼片段:Javascript原型繼承對象在對象中

TEST=function(){}; 
    TEST.prototype={ 
     b:{ 
      b1:"", 
      b2:{} 
     } 
    }; 

    //Instance 1 
    var first=new TEST(); 
    first.b.b1="TEXT"; 

    //Instance 2 
    var second=new TEST(); 

    console.log("Result",second.b.b1); 

控制檯日誌將輸出「TEXT」,我想要「」。所以我想知道爲什麼我會得到這個結果,以及爲什麼當創建一個新實例並設置值時,它會更改「TEST」原型(這是我的主要問題)?

我得到了Bergi和Mykola(謝謝)的幫助和一份重複。但是我仍然認爲我通過這種行爲失去了一種資源,並想知道爲什麼要這樣做?在實例上工作時不需要更新原型。

回答

1

爲所有實例添加原型繼承的方法和屬性。所以當你改變原型對象的值時,你可以對所有實例進行更改。

爲了解決這個問題。您需要在構造函數中設置值,以便爲每個實例啓動不同的值。

這將輸出你想要的。

TEST=function(){ 
    this.b ={ 
     b1:"", 
     b2:{} 
    } 
}; 
TEST.prototype.forAll = "im global"; 
//Instance 1 
var first=new TEST(); 
first.b.b1="TEXT"; 

//Instance 2 
var second=new TEST(); 

console.log("Second",second.b.b1, second.forAll); 
console.log("First",first.b.b1, first.forAll); 

希望這會有所幫助。

+0

非常感謝,我會重建我的構造函數。但我無法理解爲什麼first.b.b1和first.__ proto __.b.b1和window.TEST.prototype.b.b1是相同的邏輯? – Oddis

+1

@Oddis因爲只有一個對象,'TEST.prototype.b'和'first.b'和'second.b'都指向它 – Bergi

+0

感謝Bergi和Mykola,我接受這個。但我認爲我通過這種行爲失去了一種資源。再次感謝。 – Oddis