为什么在地图对象上使用代理时不执行Set?

时间:2018-04-10 19:52:00

标签: javascript

我在Map对象上创建了一个简单的Proxy示例。我无法弄清楚为什么没有执行Set处理程序而是为Sets执行Get。

const handler = {
  get: (targetObj, propName, receiverProxy) => {
    console.log('PROXY: From get.')
    let ret = Reflect.get(targetObj, propName, receiverProxy)
    if (typeof ret === 'function') {
      ret = ret.bind(targetObj)
    }
    return ret
  },
  set: (targetObj, propName, propValue, receiverProxy) => {
    console.log('PROXY: From set.')
    return Reflect.set(targetObj, propName, propValue, receiverProxy)
  },
}

const targetMap = new Map([
  ['iron', 'man'],
])
const targetObj = {}
const proxy = new Proxy(targetMap, handler)
console.log(proxy.set('super', 'man'))
console.log(proxy.get('super'))

2 个答案:

答案 0 :(得分:0)

Set and get不能那样工作。

您可以像使用任何普通对象一样使用代理对象。例如:

proxy.super = 'man';     // fires the setter
const x = proxy.super;   // fires the getter

然后,在get / set处理程序中,您可以调用get上的原始set / targetObj方法。

答案 1 :(得分:0)

如果您希望代理设置可以拦截对Map .set()方法的尝试调用,则您必须执行以下操作:

let handler = {
  get: (target, property, proxy) {
    if (property === "set") {
      console.log("intercepted a '.set' access on the proxied map");
      return (key, value) => {
        console.log("intercepted a 'set()' call on the proxied map");
        return target.set(key, value);
      };
    }
    return target[property];
  }
};

" get"调用handler方法以尝试任何属性访问。在方法调用中

proxy.set("some key", "some value");

" set"在实际调用方法之前,必须查找对象的属性。这是导致处理程序" get"的查找操作。方法调用。

现在,如果您在代码中创建代理,然后执行

proxy.set("some key", "some value");

你会看到日志消息在"拦截器"你调用的函数被调用。