0

我在学习面向对象的 Javascript 时遇到了一些麻烦。我有两个名为Cosmosand的类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在 is 的函数范围内setIntervalwindow但您可以通过.bind(或this像其他答案所说的那样重新声明)更改函数范围:

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

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

于 2013-02-11T05:42:46.903 回答