我有一个像这样的对象:
var obj = {key1: "hello",
key2: {keyA: "1", keyB: "2"}}
我目前正在使用此代码观看所选键的值何时发生变化:
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("key1", function(id, oldval, newval) {
console.log(newval)
});
`
当“你好”改变时,我可以处理事件。但是,如果对象的属性发生变化(Key2)而没有使用前一个函数对象的所有元素(KeyA和KeyB),我怎么能处理事件?
更好地说..当一个对象发生变化时,可以在不监视该对象的所有元素的情况下得到通知吗?
Thaaanku
答案 0 :(得分:1)
当对象 [property] 更改时,可以在不监视该对象的所有元素的情况下获得通知吗?
没有。您的watch
函数依赖于getter / setter,它们始终是特定于属性的。你能做什么:
Proxy
,旨在完全按照您的意愿执行。然而,它只是一个草案,目前只有supported in Firefox' Javascript 1.8.5。Object.observe
,但这只是一个草稿。答案 1 :(得分:0)
正如您所看到的,使用手表可以在不合规的浏览器上工作的polyfill,可以在javascript中轻松实现观看属性更改。
由于您需要的不同于任何现有功能,您必须使用属性更改处理程序(例如:function handleObjectChange(obj, oldPropValue, newPropValue, propertyPath)
)来查找属性链中的任何更改的自定义功能,其中propertyPath是一个数组,通向更改的属性(expl1:['KeyA']; expl2:['TimeData','duration'])和oldPropValue
/ newPropValue
是刚改变的属性的旧/新值。
当对象本身发生更改时,propertyPath
为null / undefined,在这种情况下,old/new PropertyValue
包含对象的旧/新值。
显然,这只是实现目标的一种方式,但基本点是:因为这是一个特定需求,建立自己的具体答案。