Proxy 对象用于定义基本操作的自定义行为(如属性查找、赋值、枚举、函数调用等)。通过 Proxy,你可以创建一个对象,在访问或修改该对象时,可以拦截并定义自定义行为。
let target = {};
let handler = {
get: function(target, prop, receiver) {
console.log(`Getting ${prop}`);
return prop in target ? target[prop] : 42;
},
set: function(target, prop, value, receiver) {
console.log(`Setting ${prop} to ${value}`);
target[prop] = value;
return true;
}
};
let proxy = new Proxy(target, handler);
console.log(proxy.foo); // Getting foo -> 42
proxy.foo = 100; // Setting foo to 100
console.log(proxy.foo); // Getting foo -> 100
get(target, property, receiver): 拦截对象属性的读取。set(target, property, value, receiver): 拦截对象属性的设置。has(target, property): 拦截 property in target 操作。deleteProperty(target, property): 拦截 delete 操作。apply(target, thisArg, argumentsList): 拦截函数调用。construct(target, argumentsList, newTarget): 拦截 new 操作。Reflect 对象提供了一组与 Proxy 对象的方法相同的静态方法。Reflect 主要的作用是对对象的操作提供默认的基本行为,并作为调用 Proxy 拦截方法的原始对象。Reflect 方法的设计使得它们的行为与在严格模式下调用的内置操作一致。
let obj = {foo: 1};
console.log(Reflect.get(obj, 'foo')); // 1
Reflect.set(obj, 'foo', 2);
console.log(obj.foo); // 2
Reflect 方法Reflect.get(target, property, receiver): 与 Proxy 的 get 拦截方法相同。Reflect.set(target, property, value, receiver): 与 Proxy 的 set 拦截方法相同。Reflect.has(target, property): 与 Proxy 的 has 拦截方法相同。Reflect.deleteProperty(target, property): 与 Proxy 的 deleteProperty 拦截方法相同。Reflect.apply(target, thisArg, argumentsList): 与 Proxy 的 apply 拦截方法相同。Reflect.construct(target, argumentsList, newTarget): 与 Proxy 的 construct 拦截方法相同。Proxy 和 Reflect 密切相关,主要体现在以下几点:
默认行为:Reflect 提供了默认行为,可以在 Proxy 的处理程序中使用 Reflect 方法来调用默认行为。例如,使用 Reflect.get 实现默认的属性访问:
let handler = {
get: function(target, prop, receiver) {
console.log(`Getting ${prop}`);
return Reflect.get(target, prop, receiver);
}
};
let proxy = new Proxy({}, handler);
console.log(proxy.foo); // Getting foo -> undefined
一致性:Reflect 方法的行为与在严格模式下直接调用的内置操作一致,这使得在 Proxy 中调用 Reflect 方法能保证行为一致性。
方便操作:Reflect 提供的静态方法使得对对象的操作更方便且语义更清晰。例如,Reflect.set 与直接使用赋值操作相比,更加直观且避免了一些边界情况。
Proxy:用于定义对象基本操作(如属性查找、赋值、枚举等)的自定义行为。通过 Proxy,可以在访问或修改对象时拦截并定义自定义逻辑。Reflect:提供一组与 Proxy 方法相同的静态方法,用于对对象的操作提供默认行为,并保证与严格模式下的内置操作一致。