我正在使用Object.defineProperty覆盖对象上的getter和setter,以便我可以收听所有突变事件。

var a = {};
Object.defineProperty(a, key, {
  get: function(){
    ..
  },
  set: function(val){
    ..
  }
}


这很好用,但有一个警告-我需要提前知道我想听的属性-这意味着我需要在开始时要遍历所有要查看的键。

如果我想在运行时像这样随机分配新属性:

a.new_attr=1;


因为我还没有定义new_attr属性,所以它不起作用。

有没有一种方法可以:


第一次分配属性时动态运行Object.defineProperty();要么
还有其他方法来处理这种情况吗? (也许可以通过某种方式监视所有属性而无需指定键)

最佳答案

我认为您真正想使用的是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);

关于javascript - 在新键上动态运行Object.defineProperty,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43590091/

10-09 23:39