javascript 如何使用代理,反映与Map集合

mitkmikd  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(164)

我听说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;
 }
});

当我调用setget时,这段代码运行良好,但是当我调用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

ee7vknir

ee7vknir1#

Proxy#get中的receiver参数是 * 代理本身 *

const proxiedMap = new Proxy(map, {
 get(target, property, receiver) {
  console.log(receiver === proxiedMap)
 }
}

Reflect.getreceiverthis,用于getter

function Reflect_get(target, property, receiver = target) {
  let descriptor = Object.getPropertyDescriptor(target, property)
  if (descriptor.get) return descriptor.get.apply(receiver)
  else return receiver[property]
}

因此,在不是Map的proxiedMap上调用get Map#size会出错
在您的例子中,您不需要bind,因为无论如何this都会被隐含为代理
您可能需要class extends Map而不是Proxy<Map>

相关问题