2013-02-11 77 views
0

我在学习面向对象的Javascript时遇到了一些麻烦。我有两个类称为CosmosBackgroundCosmos看起来是这样的:从对象本身访问对象属性

// 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.backgroundCosmos类的一个属性,所以它应该可以通过Cosmos类中定义的方法访问,否?

如果我回到我的index.html网页的脚本标记,并将其改成这样:

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

它的工作原理和Background对象被记录到控制台。任何人都可以提供解释并告诉我如何从Cosmos.tick内访问Cosmos的属性?

编辑:原来,问题是事做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

的[这些答案]无(http://stackoverflow.com/search?q=[javascript]Accessing+object+properties+from+object+itself)有用吗? – Teemu 2013-02-11 05:38:33

回答

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

0

在功能范围thissetIntervalwindow,但你可以通过.bind改变功能范围(或只是重新声明this像对方回答说):

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

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

+0

绑定很好,但我认为指出它在旧版浏览器中不受支持很重要(例如,IE8或Safari Mobile:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind#Browser_compatibility – KaeruCT 2013-02-11 05:51:24

+0

我通常会建议重新分配'this',因为它给了你更多的灵活性,但是你已经回答了第一个问题 – 2013-02-11 05:53:22