0

現在、createjs フレームワークを使用して JavaScript で作成しているゲームのシーン構造を作成しています。私が直面している問題は、プロトタイプ関数で元のクラスを適切に参照することです。私はJavaScriptに比較的慣れていませんが、プロトタイプを使用する必要があったのはこれが初めてです。私の現在のコードは次のとおりです。

function Intro(p, c){
    this.parent = p;
    var s = new createjs.Stage(c);
    this.stage = s;

    this.queue = new createjs.LoadQueue(false);
    this.queue.installPlugin(createjs.Sound);
    this.queue.addEventListener("complete", this.handleComplete);
    this.queue.loadManifest([{id:"bg", src:"images/Intro/intro_background.png"}]);
}
Intro.prototype.handleComplete = function(event){
    console.log("queue completed - handling...");
    var q = event.target;
    var bg = new createjs.Bitmap(q.getResult("bg"));
    this.stage.addChild(bg);
    this.stage.update();
}

たどり着いたら

this.stage.addChild(bg);

スコープが失われているようで、「undefined のメソッド 'addChild' を呼び出せません。

どんな助けでも大歓迎です!-xv

4

2 に答える 2

0

JS で関数を呼び出すと、動的にバインドされます。どの値がバインドされるthisかは、呼び出し方法、関数がコンストラクターとして呼び出されるかどうか、およびコードが厳密モードで実行されているかどうかによって異なります。

あなたの場合、次の行:

this.queue.addEventListener("complete", this.handleComplete);

関数をthisグローバル オブジェクトにバインドして実行するようにします (Web ブラウザーでは、グローバル オブジェクトはwindowオブジェクトです)。厳密モードの場合はthis未定義になります。

@dystroy が示唆したように、bind()メソッドを使用してこの動作を変更します。呼び出し:

this.queue.addEventListener("complete", this.handleComplete.bind(this));

はと同じようにのthis内部でバインディングを引き起こします。handleComplete()thisIntro


詳しく理解したい方はどうぞ。Dmitry Soshnikov のブログを読むことを強くお勧めします。

于 2013-09-23T15:26:00.627 に答える