新代理(新地图(),{})。值

时间:2017-08-15 19:48:11

标签: javascript

如何代理地图,然后访问代理地图的values

以下是我正在尝试的代码:

const things = new Proxy(new Map(), {
  set(t, k, v) {
    console.log(t, k, v);
    Reflect.set(t, k, v);
  }
});

things['foo'] = 'bar'
// console log: Map(0) {} "foo" "bar"

console.log(things['foo']);
// console log: "bar"

things.values()
Uncaught TypeError: Method Map.prototype.values called on incompatible receiver [object Object]
    at Proxy.values (native)

1 个答案:

答案 0 :(得分:1)

因此Map方法似乎抱怨其 thisArg 不是实际的get对象。一种解决方案是向代理添加const things = new Proxy(new Map(), { set(t, k, v) { console.log(t, k, v); Reflect.set(t, k, v); }, get(t, k) { if (typeof t[k] === "function") { return (...args) => Reflect.apply(t[k], t, args) } return t[k]; } }); ,以检查正在获取的属性是否是函数,如果是,则返回一个使用原始的非代理对象调用所请求函数的函数。

things.values.call(someOtherMap)

一个潜在的缺点是返回的函数将有效地绑定到原始地图。对于大多数情况可能不是问题,但它会使{{1}}之类的调用无效。如果这是一个问题,可能有办法解决这个问题。