我想设置一个观察者/监听系统:
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);
我希望你对这两条注释行的想法,(如果它实际上可以像被发现一样工作),并且如果有更直接的方式通过调用它们的方法来通知对象。 (例如,我注意到一些实现将函数名称作为字符串而不是函数的引用传递,而不是这种方式。)
由于
答案 0 :(得分:2)
好的首先,有多个问题让我们一一拿走:
objArr[i].obj.fn();
不会按预期执行。它将寻找并调用fn方法,但是您期待从obj调用myMethod
。要解决此问题,您有多种选择。使用apply
或call
。所以你的代码看起来像objArr[i].fn.call(objArr[i].obj)
。这就是JS库如jQuery或Mootools或PrototypeJS的好处。setTimeout
,所以你的代码看起来如下所示,因为JS是单线程浏览器会对回调函数进行排队,甚至会出现错误,其余部分也不会受到影响。function notify(objArr){ for (var i in objArr){ window.setTimeout(function(){ objArr[i].call(objArr[i].obj);}, 0); } }
答案 1 :(得分:1)
看一下这篇文章
http://jqfaq.com/how-to-get-notified-within-an-object-when-one-of-that-objects-property-changes/
在这篇文章中,您可以看到他们如何使用Object.defineProperty来通知属性更改。