Javascript动态方法调用

Javascript动态方法调用,javascript,methods,call,listener,notify,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} } ad

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

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);
我希望你能对这两条评论行有一些想法,(如果它真的能像expceted那样工作的话)以及是否有一种更直接的方式通过调用对象的方法来通知对象。(例如,我注意到一些实现将函数名作为字符串传递,而不是以这种方式传递函数引用。)


谢谢

好的,首先有多个问题,让我们逐一讨论:

  • objArr[i].obj.fn()不会做您期望的事情。它将寻找并调用fn方法,但是您希望从obj调用
    myMethod
    。要解决此问题,您有多个选项。或者使用,或者。因此,您的代码看起来类似于
    objArr[i].fn.call(objArr[i].obj)
    。这就是像jQuery、Mootools或PrototypeJS一样好的JS库的工作方式
  • 第二个问题,如果回调函数抛出异常并出现错误怎么办?在某些浏览器中,循环将停止迭代,因此不会再调用任何回调(函数)。解决方案也可以是多个,可以使用try-catch-block,也可以使用我最喜欢的方法。使用
    setTimeout
    ,这样您的代码看起来就像下面给出的一样,因为JS是单线程浏览器,它将对回调函数进行排队,即使出现错误,其余函数也不会受到影响
函数通知(objArr){ 用于(objArr中的var i){ setTimeout(函数(){objArr[i].call(objArr[i].obj);},0); } }
  • 这肯定不是最佳的,但接近最佳的解决方案,所以看看周围的许多库(谷歌It)来改进它。我自己编写了这样一个独立的事件管理酒吧子库

    • 看看这篇文章

      在本文中,您可以看到他们如何使用Object.defineProperty通知属性更改

      function notify(objArr){ for (var i in objArr){ window.setTimeout(function(){ objArr[i].call(objArr[i].obj);}, 0); } }