定义捕获器
-
使用代理的主要目的是可以定义捕获器(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()捕获器。注意,只有在代理对象上执行这些操作才会触发捕获器,在目标对象上执行这些操作仍然会产生正常行为。