2012-11-11 40 views
0

編輯 我仍然想知道爲什麼會發生這種情況,但在閱讀原型的東西后,我的解決方案是不讓2對象覆蓋基原型本http://freshbrewedcode.com/derekgreer/2011/12/31/solid-javascript-the-liskov-substitution-principle/JavaScript原型繼承 - 2對象使用自己的原型方法,但只有1被稱爲

我有3個對象

基礎對象被調用的對象控制

對象錢袋和對象movementPad都繼承控件的原型。

兩個錢袋和movementPad有2個不同的繪製功能,使代碼看起來像這樣

Money.prototype.Draw = function (context) { 
    console.log("foo2"); 
} 

MovementPad.prototype.Draw = function (context) { 
    console.log("foo1"); 
} 
我HUD.js

兩個對象都initalized,鐵漢然後調用這些2個對象繪製像這樣

var movementControl = new MovementPad(screenManager, 1,1,1,1); 

var money = new Money(screenManager, 10, 10, 37, 36); 

    // .... code skipped 
this.Draw = function (context) { 
    movementControl.Draw(context); 
    money.Draw(context); 
} 

我的問題是這兩個對象都沒有調用它們的繪製方法。如果我先初始化移動面板,那麼這個繪製方法將被調用,如果我初始化金錢,那麼只會調用繪製方法。

我在想什麼理解/做錯了他們的繪製方法的原型不被調用。

(以下更多的代碼)

function control(x, y, width, height) { 
    "use strict" 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    this.height = height; 

    var defaultImg = new Image(); 
    defaultImg.src = "blank.png"; 
} 


    //.... code skipped 

control.prototype.Draw = function (context) { 
    context.drawImage(defaultImg, this.x, this.y, this.width, this.height); 
} 

movementPad.js

MovementPad.prototype = control.prototype; 
MovementPad.prototype.constructor = MovementPad; 

function MovementPad(screenManager, x, y, width, height) { 
    "use strict" 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    this.height = height; 

    //.... code skipped 

    MovementPad.prototype.Draw = function (context) { 
     context.drawImage(movementPad, x, y , width ,height); 

    } 

}

Money.js

Money.prototype = control.prototype; 
Money.prototype.constructor = Money; 

function Money(screenManager, x, y, width, height) { 
    "use strict" 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    this.height = height; 

    //.... code skipped 

    Money.prototype.Draw = function (context) { 
     context.drawImage(moneyBag, x, y, width, height); 
    } 
} 
+1

你設定,讓'MovementPad.prototype'和'Money.prototype'都指向同一個對象,'control.prototype',所以當你添加一個'Draw'功能來定義哪一個其次,它覆蓋先畫一個你定義的那個函數。 – nnnnnn

+0

感謝那是我正在尋找的答案,我有一段時間沒有使用堆棧溢出,所以我想知道你評論的問題在哪裏回答是,我似乎無法找到它。< – zidsal

+0

啊,打我:) :) – hurrymaplelad

回答

0

您指定的control.prototype相同的實例Ť o MoneyMovementPad的原型,所以你的Draw方法聲明是互相破壞的。

製作原型單獨的實例:

Money.prototype = new control(); 
// ... 
MovementPad.prototype = new control(); 

和你Draw分配應該工作。