1 回答

TA貢獻1830條經驗 獲得超3個贊
一種方法是動態創建 的綁定版本并改用它:gameOn()
{
// ...
start() {
for (let coin of coins) {
this.moveCoin(coin);
}
if (this.boundGameOn === undefined) {
this.boundGameOn = this.gameOn.bind(this);
}
window.addEventListener("keydown", this.boundGameOn)
},
stop() {
window.removeEventListener("keydown", this.boundGameOn);
},
// ...
}
理想情況下,您會在構造函數中執行此操作。如果你有一個構造函數而不是一個對象文本,你可以這樣做:
function GameObject () {
this.boundGameOn = this.gameOn.bind(this)
}
GameObject.prototype = {
// rest of code ..
}
事實上,在 React 應用程序中,看到這種設計模式并不少見:
function GameObject () {
this.gameOn = this.gameOn.bind(this); // MAGIC!!
}
GameObject.prototype = {
// ...
start() {
for (let coin of coins) {
this.moveCoin(coin);
}
window.addEventListener("keydown", this.gameOn)
},
stop() {
window.removeEventListener("keydown", this.gameOn);
},
// ...
}
MAGIC 行確保內部始終指向游戲對象,因為您正在用其自身的綁定版本覆蓋它。thisgameOn()
這在ES6類語法中看起來稍微干凈一些(只是稍微有點,我個人對這兩種語法都沒有偏好):
class GameObject {
constructor () {
this.gameOn = this.gameOn.bind(this); // MAGIC!!
}
// ...
start() {
for (let coin of coins) {
this.moveCoin(coin);
}
window.addEventListener("keydown", this.gameOn)
}
stop() {
window.removeEventListener("keydown", this.gameOn);
}
// ...
}
使用為ES7提出的實驗性類屬性語法,它甚至更簡單:你可以只使用箭頭函數(現在不要直接使用它,2020年中期,因為Safari不支持這個,但如果你使用Babel或Typescript,你可以編譯到ES6):
class GameObject {
// ...
start = () => {
for (let coin of coins) {
this.moveCoin(coin);
}
window.addEventListener("keydown", this.gameOn)
}
stop = () => {
window.removeEventListener("keydown", this.gameOn);
}
// ...
}
在本例中由箭頭函數綁定。this
添加回答
舉報