在JavaScript中,Proxy和Reflect是ES6引入的一对强大的元编程工具。它们允许你拦截并自定义对象的基本操作,为高级抽象、框架开发和复杂行为控制打开了新的大门。
![图片[1]-什么是Proxy和Reflect?-速码派](http://www.sumapai.com/wp-content/uploads/2026/01/9760b9e796c243deaab2128c6d583400tplv-tb4s082cfz-aigc_resize_1080_1080-1024x683.webp)
Proxy:对象的代理器
Proxy对象用于创建一个对象的代理,从而可以拦截并重新定义该对象的基本操作,如属性读取、赋值、函数调用等。它就像是在目标对象前设置的一个“拦截层”或“中间人”。
const target = { message: 'hello' };
const handler = {
get(obj, prop) {
console.log(`读取属性: ${prop}`);
return prop in obj ? obj[prop] : '属性不存在';
},
set(obj, prop, value) {
console.log(`设置属性: ${prop} = ${value}`);
obj[prop] = value;
return true; // 表示设置成功
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.message); // 触发 get,输出 'hello'
console.logproxy.undefinedProp); // 触发 get,输出 '属性不存在'
proxy.message = 'world'; // 触发 set
在上面的例子中,我们通过定义handler对象的get和set陷阱(trap),拦截了对proxy对象的读取和设置操作。Proxy可以拦截多达13种基本操作,包括has(in操作符)、deleteProperty、construct(new)等。
Reflect:操作对象的默认行为
Reflect是一个内置对象,它提供了一组与Proxy陷阱一一对应的静态方法。这些方法正是JavaScript执行那些默认底层操作(如属性访问、赋值)的实际方式。
const obj = { a: 1 };
// 传统写法
console.log(obj.a);
obj.b = 2;
// 使用 Reflect
console.log(Reflect.get(obj, 'a'));
Reflect.set(obj, 'b', 2);
Reflect方法的设计目的之一,就是为Proxy的陷阱处理器提供一个方便、可靠的方式来调用对象的默认行为。这使得你可以在自定义行为前后,轻松地“回退”到默认操作。
Proxy与Reflect的协作
在实际使用中,Proxy的陷阱处理器经常与Reflect方法配对使用。你可以在执行自定义逻辑后,通过Reflect调用默认行为,或者完全覆盖它。
const validator = {
set(obj, prop, value) {
if (prop === 'age' && typeof value !== 'number') {
throw new TypeError('Age must be a number');
}
// 验证通过,调用默认的 set 行为
return Reflect.set(obj, prop, value);
}
};
const person = new Proxy({}, validator);
person.age = 30; // 成功
person.age = 'old'; // 抛出 TypeError
这种模式非常强大:你可以在Proxy中注入校验、日志、副作用等逻辑,然后用Reflect完成最终的实际操作,保证了拦截的透明性和可控性。
实际应用场景
Proxy的用途广泛。它可以用于实现数据绑定和响应式系统(如Vue 3的核心),创建具有惰性求值或缓存功能的“智能”对象,设置访问控制(如私有属性模拟),甚至实现简单的ORM层。
function createObservable(target, callback) {
return new Proxy(target, {
set(obj, prop, value) {
const oldValue = obj[prop];
const result = Reflect.set(obj, prop, value);
if (result && oldValue !== value) {
callback(prop, oldValue, value);
}
return result;
}
});
}
这个简单的观察者模式实现,在对象属性变化时自动触发回调。Proxy和Reflect共同将JavaScript从一门描述“对象是什么”的语言,部分转变为可以描述“对象如何行为”的语言,是构建高级框架和库的基础设施。




















暂无评论内容