2017-10-17 127 views
0

我有一個對象像這樣:'this'(內部方法)不會引用原始對象嗎?

let game = { 
    canvas: document.getElementById('main_canvas').getContext("2d"), 
    clear: function(){ 
     this.canvas.clearRect(0,0,400,400); 
    }, 
    update: function(){ 
     this.clear(); 
     //more code 
    }, 
}; 

在我明確的方法一切正常使用「這個」指的是「遊戲」,但是當我在它不是指的「更新」的方法用「這個」到'遊戲'?當我使用game.clear();一切正常,但'這'我得到undefined。如果有人知道這個原因,請發表回覆。我最近了解了對象並知道箭頭函數不會給出'this',但認爲像上面那樣的匿名函數可以讓我引用'父'或owner對象。

+0

你正在使用'this'是你應該構造函數使用它(當您通過調用與'new'功能使對象的實例)的方式,而不是靜態對象文本的方式。 –

+1

'this'的值取決於函數的調用方式。所以告訴我們如何調用'game.update'。可能是[如何在回調中訪問正確'this'的副本?](https://stackoverflow.com/q/20279484/218196) –

+0

您還應該閱讀[「this」關鍵字如何工作?]( https://stackoverflow.com/q/3127429/218196),https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this和https://github.com/getify /你不知道JS/tree/master/this%20%26%20object%20原型 –

回答

0

您需要使用.bind

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind

這實質上它綁定到創建方法的對象。

它應該看起來像這樣。

let game = { 
    canvas: document.getElementById('main_canvas').getContext("2d"), 
    clear: function(){ 
     this.canvas.clearRect(0,0,400,400); 
    }.bind(this), 
    update: function(){ 
     this.clear(); 
     //more code 
    }.bind(this), 
}; 
+0

或者'game.update()',它可以工作,而不是像'callback = game.update; callback()',這不起作用。 – ArneHugo

+1

如果有ES6支持(如使用babel等轉譯器)可以使用箭頭功能。 –

+0

您可能想要展示他們如何將'.bind'應用於他們的案例。 –

相關問題