在我的reactor模式回调中将正确的对象作为“this”

时间:2013-07-26 19:59:09

标签: javascript design-patterns this reactor

首先,我想说这是我第一次使用反应堆模式。 我已经用我所拥有的知识尝试了一切,但没有任何成功。到目前为止,这是我的脚本:

function Reactor(){
  this.events = {};
}

Reactor.prototype.registerEvent = function(eventName){
  this.events[eventName] = {name: eventName, callbacks: []};
};

Reactor.prototype.dispatchEvent = function(eventName, eventArgs){
  for(var i in this.events[eventName].callbacks) {
    this.events[eventName].callbacks[i](eventArgs);
  }
};

Reactor.prototype.addEventListener = function(eventName, callback){
    if(typeof(this.events[eventName]) == 'undefined') this.registerEvent(eventName);
    return this.events[eventName].callbacks.push(callback) - 1;
};

并测试脚本我有这个

var test = new Reactor();

test.addEventListener('ping', function() {
    console.log(this); //I want this to be the 'test' object
});

test.dispatchEvent('ping');

所以我创建了一个新的reactor对象,向它添加了一个eventlistener然后调度该事件。 但在回调函数中,我希望“this”成为“测试”对象。

1 个答案:

答案 0 :(得分:1)

您可以使用callapply调用您的方法来强制使用特定的this值:

Reactor.prototype.dispatchEvent = function(eventName, eventArgs){
  for(var i in this.events[eventName].callbacks) {
    this.events[eventName].callbacks[i].apply(this, eventArgs);
  }
};

(假设eventArgs是一个数组,将调用回调,并将数组中的每个元素作为单独的参数传递)