定义捕获器

159 阅读1分钟

定义捕获器

  • 使用代理的主要目的是可以定义捕获器(trap)。捕获器就是在处理程序对象中定义的 '基本操作的拦截器'。每个处理程序对象可以包含 0 个或多个捕获器,每个捕获器都对应一种基本操作,可以直接或间接在代理对象上调用。每次在代理对象上调用这些基本操作时,代理可以在这些操作传播到目标对象之前先调用捕获器函数,从而拦截并修改相应的行为。

  • 例如,可以定义一个get()捕获器,在 ECMAScript 操作以某种形式调用get()捕获器时触发。下面的例子定义了一个get()捕获器

    const target = {
      foo: "bar",
    };
    const handler = {
      // 捕获器在处理程序对象中以方法名为键
      get() {
        return "handler override";
      },
    };
    const proxy = new Proxy(target, handler);
    
    console.log(proxy.foo); // handler override
    console.log(target.foo); // bar
    
  • 这样,当通过代理对象执行 get()操作时,就会触发get()捕获器。当然 get()不是 ECMAScript 对象可以调用的方法,这个操作在 JavaScript 代码中可以通过多种形式触发并被 get() 捕获器拦截到。proxy[property]、proxy.prototype 或 Object.create(proxy)[pproperty]等操作都会触发基本的 get()操作以获取属性。因此所有这些操作只要发生代理对象上,就会触发 get()捕获器。注意,只有在代理对象上执行这些操作才会触发捕获器,在目标对象上执行这些操作仍然会产生正常行为。