每当对象属性发生更改时,Javascript实现回调
我需要在对象属性更改时回调的东西,类似于object.watch和object.observe。然而,这些还不是跨浏览器的 我需要支持以下几点:每当对象属性发生更改时,Javascript实现回调,javascript,Javascript,我需要在对象属性更改时回调的东西,类似于object.watch和object.observe。然而,这些还不是跨浏览器的 我需要支持以下几点: 在上的同一属性上支持多个手表 同一物体 它不能改变对象 必须有一种方法可以在不影响他人的情况下取消特定的手表 我实施了以下符合标准1)和2)但不符合标准3)的措施: 比如,;这项工作: var o = {}; o.a = 1; var c0 = watch(o,"a",function(v){console.log("watch: "+v)}); v
var o = {};
o.a = 1;
var c0 = watch(o,"a",function(v){console.log("watch: "+v)});
var c1 = watch(o,"a",function(v){console.log("watch: "+v)});
> o.a = 5;
"watch 5"
"watch 5"
然而,问题在于取消。如果我调用c1(),一切都很好,因为它只是弹出了它的getter/setter。但是,如果我调用c0,那就不起作用了,因为它会将getter/setter状态重置为调用第一个表之前的状态,从而消除第二个表的触发。我的问题是,有没有办法解决这个问题?不要自己写,你应该尝试找到并使用现有的垫片(只需在谷歌上搜索“Object.observe shim”)
尽管如此,我还是尝试修复了您的代码:我已经研究了它们,但它们使用轮询来完成此功能(即,使用setInterval和比较值),而我需要一个在属性更改时触发的解决方案。也就是说,我确实喜欢您的解决方案。我已在anwer中更新了版本,因为如果您使用已自定义属性的对象进行监视,则会出现错误。。
var o = {};
o.a = 1;
var c0 = watch(o,"a",function(v){console.log("watch: "+v)});
var c1 = watch(o,"a",function(v){console.log("watch: "+v)});
> o.a = 5;
"watch 5"
"watch 5"