我在学习面向对象的Javascript方面遇到了一些麻烦。我有两个名为Cosmos
和Background
的课程,Cosmos
看起来像这样:
// 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);
}
但是,仍然不知道最好的方法。
答案 0 :(得分:2)
从setInterval
调用该函数时,this
将不再绑定到该对象。
这是对您的问题的快速解决方法:
// 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
。
答案 1 :(得分:0)
this
的函数范围中的 setInterval
为window
,但您可以通过.bind
更改功能范围(或者只是重新声明this
,就像其他答案所说的那样):
this.ticker = setInterval(this.tick.bind(this), 1000 / 60);