Proxy 是 JavaScript 用于创建对象代理以拦截并自定义基本操作的构造函数,支持 13 种 trap(如 get、set、has、apply、construct),可实现响应式、只读对象、虚拟属性、懒加载及调试增强等功能。

JavaScript 的 Proxy 是一个内置构造函数,用于创建一个对象的代理,从而拦截并自定义对该对象的基本操作(比如读取、赋值、枚举、函数调用等)。它不是用来替代对象本身,而是“站在对象前面”,在访问发生时插入逻辑。
拦截对象的任意操作
Proxy 可以捕获 13 种不同的底层操作,统称为“trap”。常见如:
- get:读取属性时触发,可用于实现默认值、响应式依赖收集、链式调用兜底
- set:设置属性时触发,适合做数据校验、自动类型转换、变更通知(如 Vue 3 响应式核心)
-
has:用
in操作符检查属性时触发,可隐藏内部属性或模拟稀疏数组 - apply:调用函数时触发,可用于装饰器、参数预处理、调用日志
-
construct:用
new实例化时触发,能控制构造行为或返回不同实例
实现不可变数据结构
通过在 set、deleteProperty、defineProperty 等 trap 中统一抛错,可以创建运行时只读对象,比 Object.freeze() 更彻底——它连嵌套对象也能拦截,且支持自定义错误提示:
set() { throw new Error("Cannot modify read-only object"); },
deleteProperty() { throw new Error("Cannot delete property"); }
});
透明的虚拟对象与懒加载
Proxy 不需要预先定义属性,可以动态响应任意属性访问。例如:
标签: vue javascript java app 懒加载 栈 proxy 环境变量 性能瓶颈
还木有评论哦,快来抢沙发吧~