Javascript动态方法调用

时间:2012-10-20 05:49:34

标签: javascript methods call listener notify

我想设置一个观察者/监听系统:

var listeners = [];

function MyObj(){
    this.myMethod = function(){
        // react to event
    }
}

var myObj = new MyObj();

function addListener(fn, obj){
    alliancesNotify[alliancesNotify.length] = {fn: fn, obj: obj}
}

addListener(myObj, myObj.myMethod); // Best way of doing it?

function notify(objArr){
    for (var i in objArr){
        objArr[i].obj.fn(); // will this work? 
    }
}

notify(listeners);

我希望你对这两条注释行的想法,(如果它实际上可以像被发现一样工作),并且如果有更直接的方式通过调用它们的方法来通知对象。 (例如,我注意到一些实现将函数名称作为字符串而不是函数的引用传递,而不是这种方式。)

由于

2 个答案:

答案 0 :(得分:2)

好的首先,有多个问题让我们一一拿走:

  • objArr[i].obj.fn();不会按预期执行。它将寻找并调用fn方法,但是您期待从obj调用myMethod。要解决此问题,您有多种选择。使用applycall。所以你的代码看起来像objArr[i].fn.call(objArr[i].obj)。这就是JS库如jQuery或Mootools或PrototypeJS的好处。
  • 第二个问题,如果回调函数抛出异常并有错误怎么办?在某些浏览器中,循环将停止迭代,因此将导致不再调用其他回调(函数)。解决方案可以再次使用多次,使用try catch块或者做我最喜欢的方法。使用setTimeout,所以你的代码看起来如下所示,因为JS是单线程浏览器会对回调函数进行排队,甚至会出现错误,其余部分也不会受到影响。
    function notify(objArr){
        for (var i in objArr){
            window.setTimeout(function(){ objArr[i].call(objArr[i].obj);}, 0);
        }
    }
  • 这绝对不是最佳解决方案,而是接近最佳解决方案,所以看看周围的许多图书馆(谷歌)来改进它。我自己编写了一个用于事件管理的独立PUB SUB库check it out here

答案 1 :(得分:1)