Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每当对象属性发生更改时,Javascript实现回调_Javascript - Fatal编程技术网

每当对象属性发生更改时,Javascript实现回调

每当对象属性发生更改时,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

我需要在对象属性更改时回调的东西,类似于object.watch和object.observe。然而,这些还不是跨浏览器的

我需要支持以下几点:

  • 在上的同一属性上支持多个手表 同一物体
  • 它不能改变对象
  • 必须有一种方法可以在不影响他人的情况下取消特定的手表
  • 我实施了以下符合标准1)和2)但不符合标准3)的措施:

    比如,;这项工作:

    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"