javascript proxy拦截器的核心组成是目标对象(target)和处理器对象(handler):target为被代理的原始对象或函数,不感知代理且不递归代理嵌套属性;handler定义get、set等trap方法来拦截操作,未实现的trap默认透传,proxy实例通过new proxy(target, handler)创建并依赖引擎原生支持。

JavaScript 中 Proxy 拦截器的核心组成就两个:目标对象(target)和处理器对象(handler)。
目标对象(target)
这是被代理的原始数据载体,可以是普通对象、数组、函数、类实例,甚至 null 或 undefined(但代理 null/undefined 会报错)。它本身不感知被代理,所有操作最终仍作用于它——只是中间多了一层可控的“关卡”。
- 必须是真实存在的对象或函数;原始值(如字符串、数字)会被自动包装成对应包装对象
- Proxy 不修改 target,也不递归代理其嵌套属性——想深层响应需手动递归创建子 Proxy
- 对 target 的直接操作(绕过 proxy)不会触发任何拦截,所以应避免混用
处理器对象(handler)
这是拦截逻辑的“控制中心”,一个纯 JS 对象,里面定义各种 trap(陷阱)方法。每个 trap 对应一种底层操作,比如读属性、写属性、调用函数等。
- 常用 trap 包括:get(读取属性)、set(赋值)、apply(函数调用)、construct(new 调用)、has(in 操作符)、deleteProperty(delete 操作)
- trap 函数接收标准化参数,例如 set(target, key, value, receiver),其中 receiver 是当前 proxy 实例,用于正确绑定 this
- 不是所有 trap 都必须实现;未定义的 trap 会走默认行为(即透传到 target)
Proxy 实例本身
由 new Proxy(target, handler) 创建,它不是新对象,而是一个“行为可编程”的代理引用。所有对它的操作都会被 handler 捕获,再决定是否、如何转发给 target。
- 它不可枚举自身 trap 方法,也不能被 JSON.stringify 直接序列化(会得到空对象)
- 可通过 Proxy.revocable() 创建可撤销代理,适用于需要动态关闭拦截的场景
- instanceof 检查仍指向原构造器,因为 Proxy 只改行为,不改原型链
底层机制支撑
Proxy 能生效,依赖 JS 引擎在运行时对对象操作的统一调度。引擎执行 obj.prop 时,会先判断 obj 是否为 Proxy 实例;若是,就查找 handler 中对应的 trap 并执行,跳过默认逻辑。
- 这不是语法糖或 polyfill,而是 V8、SpiderMonkey 等引擎原生支持的语言级能力
- 因此拦截粒度细、性能开销可控,且对新增属性天然有效(不像 Object.defineProperty 需预先声明)
- 不兼容 IE,现代浏览器和 Node.js ≥10 均已稳定支持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











