在新密钥上动态运行Object.defineProperty

时间:2017-04-24 13:56:41

标签: javascript web

我使用Object.defineProperty来覆盖对象的getter和setter,这样我就可以监听所有的变异事件。

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

这很好用,但有一点需要注意 - 我需要事先知道我想要听哪些属性 - 这意味着我需要在开始时遍历我想要观看的所有键。

如果我想在运行时期间随意分配一个新属性,请执行以下操作:

a.new_attr=1;

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

有没有办法:

  1. 第一次分配属性时动态运行Object.defineProperty();或
  2. 处理这种情况的任何其他方式? (也许某种方式来监控所有属性而不指定密钥)

1 个答案:

答案 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);