我如何在实例对象中调用方法,但是在另一个上下文中 实例对象。
最好的解释方法是通过这个简短的实验。
game.js
var ball = new Ball();
ball.addMotionListener(function(){this.color = someNewRandomColor});
内部ball.js
Ball = class{
constructor(){
this._position = new Vector(0,0);
this._color = red;
this._onChangeManager = new OnChangeManager();
}
addMotionListener(listener){
this._onChnangeManager.addMotionListner(listener);
}
set position(newP){
this._position = newP;
this._onChangeManager.motionEvent();
}
}
和onChangeManager.js
OnChangeManager = class{
constructor{ this._motionListenerQueue = [] }
addMotionListener(newListener){
this._motionListenerQueue.push(newListener);
}
motionEvent(){
for(listener in _motionListenerQueue){
listener();
}
}
}
现在加入game.js
kickBall(ball);
改变球的位置,在onChangeManager中触发运动事件侦听器,目标是改变球的颜色。当然,这是行不通的,因为this.color
是在ball的上下文中,而不是在onChangeManager的上下文中。
是否可以在onChangeManager对象中运行方法,但可以在ball的上下文中运行?
编辑:对琐碎/重复的问题很抱歉,我对js上下文不熟悉
答案 0 :(得分:2)
您可以使用Function.prototype.bind将上下文绑定到作为回调传递的函数:
var ball = new Ball();
ball.addMotionListener(function() {
this.color = someNewRandomColor
}.bind(ball));
P.S。在回调中,您引用的是color
属性,而在Ball
构造函数中,则具有_color
属性。我不确定是否打算这样做。