2013-02-11 76 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