我在javascript中制作一个简单的游戏。这些是我的玩家方法(有问题的部分是在玩家遇到水后半秒钟调用重置方法):
Player.prototype = {
update : function(){
// player control and edge of screen detection
// TODO factor out hardcoding into sprite width constants
if (this.keyPressed === 'right' && this.x < 400){
this.x += 100;
}
if (this.keyPressed === 'left' && this.x > 10){
this.x += -100;
}
if (this.keyPressed === 'up' && this.y > 10){
this.y -= 83;
}
if (this.keyPressed === 'down' && this.y < 400){
this.y -= -83;
}
// reset key press
this.keyPressed = null;
// if reaches water, reset position
if (this.y < 60) {
setTimeout(this.reset, 500);
}
},
reset : function(){
// TODO factor these constants out
// console.logs for testing
console.log("a");
console.log(this);
this.x = 200;
this.y = 405;
console.log(this.x);
},
render : function(){
ctx.drawImage(Resources.get(this.sprite), this.x, this.y);
},
handleInput : function(e){
this.keyPressed = e;
}
}
我的问题是,当update
调用reset
时,关键字this
不会绑定到player
,而是绑定到window
。
我可以只在player.x
中加入player.y
和reset
,但这样做会不会在原型中编写方法?
我想过使用call()
设置this
的值,但我似乎无法使用setTimeout()
。这不起作用(错误:对象不是函数):
setTimeout(this.reset.call, 500, this);
..这两者都没有(重置正确但立即执行):
setTimeout(this.reset.call(this), 500);
那么如何将this
设置为player
并将其reset
传递给setTimeout
?
答案 0 :(得分:6)
您可以使用bind:
setTimeout(this.reset.bind(this), 500);
答案 1 :(得分:5)
你没有。 call
将立即调用该函数,以便将返回值传递给setTimeout
。
请改用bind
。 bind
生成一个新函数,该函数使用不同的上下文(和默认变量)调用原始函数。
setTimeout(this.reset.bind(this), 500);