如何代理地图,然后访问代理地图的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)
答案 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}}之类的调用无效。如果这是一个问题,可能有办法解决这个问题。