Javascript 什么';这是最有效的';手表';从多个地方监视同一对象/属性的js?

Javascript 什么';这是最有效的';手表';从多个地方监视同一对象/属性的js?,javascript,node.js,watch,eventemitter,object.observe,Javascript,Node.js,Watch,Eventemitter,Object.observe,我使用ECMA7对象进行数据绑定。观察或Mozilla对象。观察而不是节点的eventEmitter 对于Object.observe,我找不到任何android浏览器兼容的实现。他们基本上必须使用setTimeout轮询,所以我放弃了 相反,Object.watch可以通过Chrome库和本机Firefox等运行,而无需任何轮询 我找到的代码是 if (!Object.prototype.watch) { Object.defineProperty(Object.prototype,

我使用ECMA7
对象进行数据绑定。观察
或Mozilla
对象。观察
而不是节点的
eventEmitter

对于
Object.observe
,我找不到任何android浏览器兼容的实现。他们基本上必须使用setTimeout轮询,所以我放弃了

相反,
Object.watch
可以通过Chrome库和本机Firefox等运行,而无需任何轮询

我找到的代码是

if (!Object.prototype.watch)
{
    Object.defineProperty(Object.prototype, "watch",
    {
        enumerable: false,
        configurable: true,
        writable: false,
        value: function(prop, handler)
        {
            var
            oldval = this[prop],
                newval = oldval,
                getter = function()
                {
                    return newval;
                },
                setter = function(val)
                {
                    oldval = newval;
                    return newval = handler.call(this, prop, oldval, val);
                };

            if (delete this[prop])
            { // can't watch constants
                Object.defineProperty(this, prop,
                {
                    get: getter,
                    set: setter,
                    enumerable: true,
                    configurable: true
                });
            }
        }
    });
}

// object.unwatch
if (!Object.prototype.unwatch)
{
    Object.defineProperty(Object.prototype, "unwatch",
    {
        enumerable: false,
        configurable: true,
        writable: false,
        value: function(prop)
        {
            var val = this[prop];
            delete this[prop]; // remove accessors
            this[prop] = val;
        }
    });
}
这与

obj.watch('foo',
      function(id, oldval, newval)
      {
        //..........

        return newval;
      });
然而,出现了一个大问题,当我在不同的地方实现多个watch时,只会触发第一个obj.watch,而不会触发其余的obj.watch

原因是显而易见的

在第一个触发器上,rest obj.watch自动设置为监视更改的值

测试代码:

var obj = {
      foo: 5
    };

obj.watch('foo',
  function(id, oldval, newval)
  {
    alert(newval);

    return newval;
  });

obj.watch('foo',
  function(id, oldval, newval)
  {
    alert(newval);

    return newval;
  });

obj.foo = 7;
结果:无错误,但仅发出一次警报

实际上,我试图找到替代库/机制,允许为同一对象实例/属性触发多个监视块

同样,我将避免使用eventEmitter模式,而使用observer模式。 你知道吗?谢谢。

自我回答

还不确定,但一种方法是使用
melanke/Watch.JS/ 我早就知道了

它的作用是:


这是一个小图书馆,非常接近你要找的


一个制作精良的
对象。defineProperty
应该可以做到这一点

更现代的方法是将代理与
新代理(对象,{…})
一起使用

//defining our object no matter which way we want
var obj = {
    foo: "initial value of attr1" 
};

//defining a 'watcher' for an attribute
watch(obj, "foo", function(){
    alert("foo changes!");
});
watch(obj, "foo", function(){
    alert("foo changes!");
});
//when changing the attribute its watcher will be invoked
obj.foo = "other value";