Proxy拦截器参数由JS引擎自动传入,开发者须掌握各trap的固定参数:target(原对象)、propertyKey(属性名)、receiver(代理本身);construct、apply等trap参数各异,receiver影响this绑定与原型查找,Reflect方法需严格对应trap参数顺序。

Proxy 拦截器的参数由 JavaScript 引擎自动传入,开发者不能手动调用或修改传递方式,但必须理解每个 trap(拦截方法)接收哪些参数、顺序如何、各参数代表什么含义。
核心参数结构:target、propertyKey、receiver
绝大多数拦截器都遵循固定的参数模式。以 get 和 set 为例:
- target:被代理的原始对象(即 new Proxy(target, handler) 中的第一个参数)
- propertyKey:访问或设置的属性名,类型为 string 或 Symbol
- receiver:触发本次操作的代理对象本身(或继承链上的某个代理),在 Reflect.get/set 中用于正确绑定 this
例如:const p = new Proxy({x: 1}, { get(t, k, r) { console.log(t === {x:1}, k, r === p); } }); p.x; 输出 true "x" true。
常见拦截器的参数差异
不同 trap 的参数数量和含义有明显区别,需按需使用:
立即学习“Java免费学习笔记(深入)”;
-
construct:接收
(target, argumentsList, newTarget)—— 分别是原构造函数、new 调用时传入的实参数组、new 命令作用的目标(通常是 proxy 本身) -
apply:接收
(target, thisArg, argumentsList)—— 原函数、this 绑定值、调用时的参数数组 -
has、deleteProperty:只接收
(target, propertyKey) -
ownKeys:仅接收
target,返回一个字符串或 Symbol 组成的数组 -
defineProperty:接收
(target, propertyKey, descriptor),第三个参数是属性描述符对象
receiver 参数的实际用途
receiver 主要影响原型链查找和 this 绑定,在实现“透明代理”或“继承代理”时很关键:
- 当目标对象有 getter 且依赖 this 时,必须将 receiver 传给 Reflect.get 才能保持 this 正确指向代理实例
- 在 set 拦截中,若内部调用 Reflect.set,应传入 receiver,否则 setter 中的 this 可能指向 target 而非 proxy
- 不传 receiver 或传错,可能导致原型方法无法访问代理上的同名属性
避免常见误用
参数不可省略、不可重排、不可解构后乱序传给 Reflect 方法:
- 错误写法:
set(target, value) { return Reflect.set(target, 'x', value); }—— 缺少 propertyKey 和 receiver,且 value 不是 propertyKey - 正确写法:
set(target, key, value, receiver) { return Reflect.set(target, key, value, receiver); } - 不要试图用箭头函数定义 handler 方法并省略参数,会破坏参数映射
- Reflect 方法与对应 trap 参数严格一一对应,建议始终用 Reflect 转发,保证语义一致
不复杂但容易忽略。记清每个 trap 的签名,配合 Reflect 使用,就能稳定控制对象行为。


















