Proxy用于修改某些操作的默认行为, Proxy这个词的原意是代理, 用在这里表示由它来“代理”某些操作, 可以译为“代理
器”。
代理是使用 Proxy 构造函数创建的。这个构造函数接收两个参数:目标对象和处理程序对象。
const target = {
foo: 'bar'
};
const handler = {
get() {
return 'handler override';
}
};
const proxy = new Proxy(target, handler);
proxy.foo //"handler override"
这样,当通过代理对象执行 get()操作时,就会触发定义的 get()捕获器。
proxy[property]、 proxy.property 或 Object.create(proxy)[property]等操作都会触发基本的 get()操作以获取属性。
注意,只有在代理对象上执行这些操作才会触发捕获器。在目标对象上执行这些操作仍然会产生正常的行为。
const target = {
foo: 'bar'
};
const handler = {
get() {
return 'handler override';
}
};
const proxy = new Proxy(target, handler);
console.log(target.foo); // bar
console.log(proxy.foo); // handler override
console.log(target['foo']); // bar
console.log(proxy['foo']); // handler override
console.log(Object.create(target)['foo']); // bar
console.log(Object.create(proxy)['foo']); // handler override
get()捕获器会接收到目标对象、要查询的属性和代理对象三个参数
但并非所有捕获器行为都像 get()那么简单。因此,通过手动写码如法炮制的想法是不现实的。
实际上,开发者并不需要手动重建原始行为,而是可以通过调用全局 Reflect 对象上(封装了原始行为)的同名方法来轻松重建。
const target = {
foo: 'bar'
};
const handler = {
get() {
return Reflect.get(...arguments);
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.foo); // bar
console.log(target.foo); // bar