Proxy 和 Reflect 是 ES6 (ECMAScript 2015) 中引入的两个不同的构造函数,它们密切相关,通常在某些操作中一起使用。
-
Proxy:
Proxy对象用于定义基本操作的自定义行为,例如属性查找、赋值、枚举、函数调用等。当你对一个Proxy对象执行这些操作时,你可以拦截并重新定义这些操作的行为。下面是一些你可以使用
Proxy拦截的操作:get:读取属性值set:设置属性值has:in操作符deleteProperty:delete操作符apply:调用一个函数- 诸如此类的其他捕获器(handlers)
-
Reflect:
Reflect对象与Proxy捕获器(handlers)的方法一一对应。其目的是提供默认行为,对相应的对象操作进行默认的行为操作。在很多情况下,Reflect的方法与对应的直接对象操作是相同的。这里是一些
Reflect提供的方法的例子:Reflect.get():获取对象属性的值,类似于obj[prop]Reflect.set():设置对象属性的值,类似于obj[prop] = valueReflect.has():类似于prop in objReflect.deleteProperty():类似于delete obj[prop]Reflect.apply():调用一个函数- 其他与
Proxy捕获器相对应的方法
两者的关系:
Proxy和Reflect的关系体现在它们共同协作时。在Proxy的捕获器函数中,开发者可以调用对应的Reflect方法,以实现默认的行为,同时加入自己的操纵和侧面逻辑。Reflect方法提供了一种方便的方式来保持默认行为,而不需要手动编写这些语义。
例如,当在Proxy捕获器中捕获属性的读取行为时,使用Reflect.get()可以非常容易地调用相应对象的默认读取行为:
let obj = {
a: 1,
b: 2,
c: 3,
};
let p = new Proxy(obj, {
get(target, prop, receiver) {
console.log(`读取了属性 ${prop}`);
return Reflect.get(target, prop, receiver); // 调用默认操作
},
set(target, prop, value, receiver) {
console.log(`将属性 ${prop} 设置为 ${value}`);
return Reflect.set(target, prop, value, receiver); // 调用默认操作
},
});
console.log(p.a); // 读取了属性 a,返回 1
p.b = 4; // 将属性 b 设置为 4上面的例子中,通过Reflect对象的方法,我们不仅可以保持默认的get和set行为,还可以在这个过程之前或之后添加自己的逻辑。这样的设计使得代理行为的实现既安全又易于管理。
总而言之,Proxy和Reflect共同提供了一种强大的机制来拦截和定义基本的 JavaScript 操作,Reflect能提供操纵对象的默认方法,而Proxy则允许我们根据需要来定义这些操作的新行为。
以前对两者进行过对比, 但是没有讨论起关联关系。
以前对比的文章:#8