0

オブジェクト指向のJavascriptを学ぶのに少し問題があります。とという2つのクラスがCosmosありBackgroundCosmos次のようになります。

// js/Cosmos.js
function Cosmos() {
    this.background = new Background();

    // Fire game loop
    this.ticker = setInterval(this.tick, 1000 / 60);
}

// Main game loop
Cosmos.prototype.tick = function() {
    console.log(this.background);
}

メインのゲームループがカチカチ音をたてるとき、私undefinedはコンソールに入ります。this.backgroundはクラスのプロパティであるため、これはよくわかりません。クラスでCosmos定義されているメソッドからアクセスできるはずです。Cosmos

index.htmlページのスクリプトタグに戻って、次のように変更すると、次のようになります。

// Lift off
var cosmos = new Cosmos();
console.log(cosmos.background);

それは機能し、Backgroundオブジェクトはコンソールに記録されます。Cosmos誰かが説明を提供し、内部からのプロパティにアクセスする方法を教えてもらえますCosmos.tickか?

編集:問題は、と関係があることがわかりました。setInterval()これを行うと、適切なオブジェクトがコンソールに記録されるためです。

function Cosmos() {
    this.background = new Background();

    // Fire game loop
    //this.ticker = setInterval(this.tick, 1000 / 60);
    this.tick();
}

// Main game loop
Cosmos.prototype.tick = function() {
    console.log(this.background);
}

しかし、それを回避する最善の方法はまだわかりません。

4

2 に答える 2

2

関数が から呼び出されるとsetIntervalthisオブジェクトにバインドされなくなります。

これはあなたの問題に対する簡単な修正です:

// js/Cosmos.js
function Cosmos() {
    var self = this;
    this.background = new Background();

    // Fire game loop
    this.ticker = setInterval(function () {
        self.tick();
    }, 1000 / 60);
}

変数を使用するselfことで、内部関数は にアクセスできますthis

于 2013-02-11T05:41:54.703 に答える
0

this関数スコープでsetIntervalは is ですが、次の方法でwindow関数スコープを変更できます.bind(またはthis、他の回答のように再宣言するだけです):

this.ticker = setInterval(this.tick.bind(this), 1000 / 60);

http://jsfiddle.net/ExplosionPIlls/SwQ5V/

于 2013-02-11T05:42:46.903 に答える