2013-08-22 118 views
0

我從EASELJS庫繼承對象。 爲了簡化問題,我將代碼縮減爲最小格式。JavaScript對象成員變量不克隆

我有一個類:

this.TESTProg = this.TESTProg || {}; 

(function() { 
    var _jsbutton = function(x, y, text, icon) { 
     p.init(x, y, text, icon); 
    }; 

    var p = _jsbutton.prototype = new createjs.Container(); 

    p.x = 0; 
    p.y = 0; 
    p.text = null; 
    p.icon = null; 

    p.init = function(x, y, text, icon) { 
     this.x = 0 + x; 
     this.y = 0 + y; 
     this.text = "" + text; 
     this.icon = null; 
    }; 

    TESTProg._jsbutton = _jsbutton; 
})(); 

然後我用它在另一個JS對象:

var buttoncancel = new SJSGame._jsbutton(
      profileselConfig.cancelx, //this is defined in another jsfile: 
      profileselConfig.cancely, 
      "cancel", "_cancel.png"); 

    console.log(buttoncancel.y); //this gives 240 

    var buttoncancel2 = new SJSGame._jsbutton(
      profileselConfig.cancelx, 
      profileselConfig.cancely - 40, 
      "cancel", "_cancel.png"); 

    console.log(buttoncancel.y); //this gives 200 
    console.log(buttoncancel2.y); //this gives 200 

    buttoncancel2.y = 100; 
    console.log(buttoncancel.y); //this now gives 200 (not changed by the second object) 
    console.log(buttoncancel2.y); //this now gives 100 

配置文件:

var _profileselConfig = function(){ 
    this.cancelx = 0; 
    this.cancely = 240; 
}; 

profileselConfig = new _profileselConfig(); 

什麼我做錯了什麼?

我已經使用0 +來避免通過引用,它不工作。我現在應該怎麼做?有什麼建議麼?謝謝。

+0

也許檢查[EaselJS:有人可以解釋演示中使用的繼承模式?](http://stackoverflow.com/questions/18008421/easeljs-can-somebody-explain-the-inheritance-pattern-used-in -demos) – Bergi

回答

0

您可能應該在構造函數中調用this.init而不是p.init

當您撥打p.init時,init中的this指的是原型。因此,無論您何時創建實例,您的p.init調用都會​​修改原型,以便爲所有對象提供全部_jsbutton對象。

這就是爲什麼兩個按鈕都具有相同的x/y值:它們都從相同的原型獲得它們的位置,並且最後運行的構造函數設置原型值。當您在構造函數外部設置buttoncancel2.y時,您給該實例自己的y屬性,所以它不再使用共享原型值。

如果您在構造函數中調用this.init,那麼init中的this將引用您新創建的實例。這些實例將不再使用x,y,texticon的共享原型值。

附註:「我已經在使用0 +來避免通過引用」 - 這不是必需的,因爲基本類型總是被複制。

+0

謝謝,即使我的p是一個新的實例,不區分不同的對象。得到它了 –