是否可以在不使用Proxy
and的情况下监听属性变化setInterval
?
对于普通对象,您可以使用下面的函数,但它适用于所有现有属性,但不适用于包装后可能添加的任何属性。
function wrap(obj) {
var target = {};
Object.keys(obj).forEach(function(key) {
target[key] = obj[key];
Object.defineProperty(obj, key, {
get: function() {
console.log("Get");
return target[key];
},
set: function(newValue) {
console.log("Set");
target[key] = newValue;
}
});
});
}
var obj = {
a: 2,
b: 3
};
wrap(obj);
obj.a; // Get
obj.a = 2; // Set
obj.b; // Get
obj.b = 2; // Set
obj.c = 2; // Nothing
obj.c; // Nothing
如果对象是一个数组,您还可以侦听该length
属性并在它更改时重置所有get
和set
函数。这显然不是很有效,因为它会在添加或删除元素时更改每个元素的属性。
所以我认为这不是Object.defineProperty
答案。
我不想使用的原因setInterval
是因为间隔大会使包装不可靠,而间隔小会对效率产生很大影响。