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
。这就是像jQuery、Mootools或PrototypeJS一样好的JS库的工作方式objArr[i].fn.call(objArr[i].obj)
- 第二个问题,如果回调函数抛出异常并出现错误怎么办?在某些浏览器中,循环将停止迭代,因此不会再调用任何回调(函数)。解决方案也可以是多个,可以使用try-catch-block,也可以使用我最喜欢的方法。使用
,这样您的代码看起来就像下面给出的一样,因为JS是单线程浏览器,它将对回调函数进行排队,即使出现错误,其余函数也不会受到影响setTimeout
- 这肯定不是最佳的,但接近最佳的解决方案,所以看看周围的许多库(谷歌It)来改进它。我自己编写了这样一个独立的事件管理酒吧子库
- 看看这篇文章
在本文中,您可以看到他们如何使用Object.defineProperty通知属性更改
function notify(objArr){
for (var i in objArr){
window.setTimeout(function(){ objArr[i].call(objArr[i].obj);}, 0);
}
}