0

私はGame.jsにこの関数を持っています

Game.prototype.onClick = function(event){
     var x = event.x;
     var y = event.y;
     if (this.blueDeck[0].contains(x, y)) 
       alert("Blue Deck Clicked");
}

OnClickは、Main.jsのこの関数から呼び出されます

canvas.addEventListener('mouseup', game.onClick, false);

そして私はCard.jsにこの関数を持っています

Card.prototype.contains = function(x, y){
    return true;
}

アラートは表示されません。

onClickでifステートメントを削除すると、アラートが呼び出されます。this.blueDeck[0].setDeckPos(w, h);Game.jsで呼び出されると、他の関数も正常に機能します。

なぜcontainsがtrueを返さないのですか?

4

2 に答える 2

2

更新は私の仮定を確認します。thisDOM要素を参照します。の値は実行時に決定されます。つまり、関数がどこで/どのように定義されたかではなく、関数がどのようthisに呼び出されるかに依存します。

クロージャーを使用する:

canvas.addEventListener('mouseup', function(event) {
    game.onClick(event);
}, false);

または、要素にアクセスする必要がない場合は、.bind [MDN]を使用できます(ネイティブサポートのないブラウザーのポリフィルについては、このリンクを参照してください)。

canvas.addEventListener('mouseup', game.onClick.bind(game), false);

詳細this

于 2012-08-06T23:56:03.417 に答える
0

OPの簡単な例が機能するため、エラーは他の場所にあります。

function Game(){
  this.blueDeck = [new Card()];
}

Game.prototype.onClick = function(event){
     var x;
     var y;
     if (this.blueDeck[0].contains(x, y)) 
       alert("Blue Deck Clicked");
}

function Card(){}

Card.prototype.contains = function(x, y){
    return true;
}

var g = new Game();
g.onClick(); // "Blue Deck Clicked"

編集

質問を編集するときは、編集を明確にマークしてください。Felixの回答を参照してください。メソッドは、Gameのインスタンスではなく、イベントリスナーによって呼び出されています。これは呼び出しによって設定されることを忘れないでください。

于 2012-08-06T23:58:36.767 に答える