編輯 我仍然想知道爲什麼會發生這種情況,但在閱讀原型的東西后,我的解決方案是不讓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);
}
}
你設定,讓'MovementPad.prototype'和'Money.prototype'都指向同一個對象,'control.prototype',所以當你添加一個'Draw'功能來定義哪一個其次,它覆蓋先畫一個你定義的那個函數。 – nnnnnn
感謝那是我正在尋找的答案,我有一段時間沒有使用堆棧溢出,所以我想知道你評論的問題在哪裏回答是,我似乎無法找到它。< – zidsal
啊,打我:) :) – hurrymaplelad