Proxy用于拦截对象操作,Reflect提供标准化底层方法配合转发;二者协同实现元编程,如响应式系统、数据验证与权限控制等。

JavaScript 中的代理(Proxy)和反射(Reflect)是一对配合使用的元编程工具,它们让开发者能在运行时**拦截、观察、修改对象的底层操作**,而不直接改动原对象本身。
代理(Proxy)是“中间层”
Proxy 用来创建一个目标对象的代理实例,所有对这个代理的操作(比如读属性、写属性、调用方法、in 判断等),都会先经过你定义的 handler 处理器。它不改变原对象,只是在访问路径上加了一道可控的闸门。
- 必须传入两个参数:目标对象(target)和处理器对象(handler)
- handler 里可以定义各种“陷阱”(trap),例如 get(读取属性)、set(赋值)、has(in 操作)、deleteProperty(delete 操作)等
- 每个 trap 都能决定是否放行、如何改写、甚至阻止操作
反射(Reflect)是“标准操作封装”
Reflect 是一个内置对象,提供了一组静态方法,如 Reflect.get()、Reflect.set()、Reflect.has() 等。这些方法一一对应 JavaScript 内部的底层操作,也和 Proxy 的 trap 同名、同参、同行为。
- 它不是用来替代 Object 方法的,而是为了在 Proxy 中**安全、一致地触发默认行为**
- 比如在 set trap 里做校验后,用 Reflect.set(target, key, value, receiver) 把操作交还给原逻辑,避免手动实现或出错
- 多数 Reflect 方法返回布尔值(成功/失败),比直接抛错更利于控制流处理
为什么它们总是一起出现?
Proxy 负责“拦截”,Reflect 负责“转发”。单独用 Proxy 容易漏掉原型链、receiver 绑定、不可写属性等细节;而 Reflect 提供了标准化、可预测的底层调用方式,让拦截后的“放行”更可靠。
立即学习“Java免费学习笔记(深入)”;
- 没有 Reflect,你在 set 里手动赋值 target[key] = value 可能绕过 setter、忽略不可写性、丢失 this 上下文
- 用 Reflect.set() 就能准确复现引擎原本该做的事
- 几乎所有现代 Proxy 实践都默认搭配 Reflect 使用
它们不是语法糖,而是能力扩展
Proxy 和 Reflect 不是为了让代码更短,而是为了支持真实场景中的动态控制:










