我使用Object.defineProperty
来覆盖对象的getter和setter,这样我就可以监听所有的变异事件。
var a = {};
Object.defineProperty(a, key, {
get: function(){
..
},
set: function(val){
..
}
}
这很好用,但有一点需要注意 - 我需要事先知道我想要听哪些属性 - 这意味着我需要在开始时遍历我想要观看的所有键。
如果我想在运行时期间随意分配一个新属性,请执行以下操作:
a.new_attr=1;
它不起作用,因为我还没有定义new_attr
属性。
有没有办法:
Object.defineProperty()
;或答案 0 :(得分:2)
我认为你真正想要使用的是Proxy
。代理允许您拦截诸如get和set之类的事件。
var obj = {
a: 1,
b: 2
};
var proxiedObj = new Proxy(obj, {
get: function(target, name) {
console.log(`get: ${name}`);
return target[name];
},
set: function(target, prop, value) {
console.log(`set: ${prop}`);
target[prop] = value;
}
});
console.log(proxiedObj.a);
console.log(proxiedObj.b);
// Notice that it still works even on new properties
proxiedObj.c = 3;
console.log(proxiedObj.c);