我听说Map
集合有[[MapData]]
内部插槽,所以我需要使用Reflect
来捕获。
所以我写了一段代码如下
const map = new Map();
const proxiedMap = new Proxy(map, {
get(target, property, receiver) {
const currentValue = Reflect.get(target, property, receiver);
return typeof currentValue === "function" ? currentValue.bind(target) : currentValue;
}
});
当我调用set
和get
时,这段代码运行良好,但是当我调用size
时,错误发生了。
proxiedMap.set("a", 1);
proxiedMap.get("a"); // 1
console.log(proxiedMap.size) // TypeError: Method get Map.prototype.size called on incompatible receiver #<Map>
我解决了在反射中忽略receiver
参数的问题。但我不知道为什么它工作。
const proxiedMap = new Proxy(map, {
get(target, property) {
const currentValue = Reflect.get(target, property)
return typeof currentValue === "function" ? currentValue.bind(target) : currentValue
}
})
为什么只使用size
?
1条答案
按热度按时间ee7vknir1#
Proxy#get中的
receiver
参数是 * 代理本身 *Reflect.get
的receiver
是this
,用于getter因此,在不是Map的
proxiedMap
上调用get Map#size
会出错在您的例子中,您不需要
bind
,因为无论如何this
都会被隐含为代理您可能需要
class extends Map
而不是Proxy<Map>