调用者上下文中的JavaScript调用方法

时间:2019-01-09 15:44:22

标签: javascript scope

我如何在实例对象中调用方法,但是在另一个上下文中 实例对象。

最好的解释方法是通过这个简短的实验。

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上下文不熟悉

1 个答案:

答案 0 :(得分:2)

您可以使用Function.prototype.bind将上下文绑定到作为回调传递的函数:

var ball = new Ball();
ball.addMotionListener(function() {
    this.color = someNewRandomColor
}.bind(ball));

P.S。在回调中,您引用的是color属性,而在Ball构造函数中,则具有_color属性。我不确定是否打算这样做。