Javascript 什么';这是最有效的';手表';从多个地方监视同一对象/属性的js?
我使用ECMA7Javascript 什么';这是最有效的';手表';从多个地方监视同一对象/属性的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,
对象进行数据绑定。观察
或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";