proxy 最常用核心用法是通过 get 和 set trap 拦截对象读取与修改:get 拦截属性访问并返回自定义值,需避免 proxy 递归;set 拦截赋值并校验,须返回 true 表示成功;in、for...in 等需配合 has、ownkeys 等 trap 实现完整拦截。

Proxy 可以通过 get 和 set 两个 trap 拦截对象的读取与修改操作,这是最常用、最核心的用法。
拦截读取:用 get 捕获属性访问
get trap 在访问对象属性(包括点号、方括号、解构、in 操作符、Object.getOwnPropertyDescriptor 等)时触发。它接收三个参数:目标对象、属性名、代理本身(receiver,常用于正确处理 this)。
- 返回值就是属性访问的结果,可任意控制(如返回默认值、计算值、抛错)
- 若未定义 get,访问不存在属性会返回 undefined;但定义后必须显式返回,否则默认返回 undefined
- 注意避免无限递归:在 get 中读取 target[prop] 是安全的,但读取 proxy[prop] 会再次触发 get
示例:
const obj = { count: 1 };const proxy = new Proxy(obj, {
get(target, prop) {
if (prop === 'doubleCount') return target.count * 2;
return target[prop];
}
});
console.log(proxy.count); // 1
console.log(proxy.doubleCount); // 2
拦截修改:用 set 捕获赋值操作
set trap 在给属性赋值时触发(包括 =、Object.defineProperty、解构赋值等),接收四个参数:目标对象、属性名、新值、代理本身。
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
- 必须返回 true 表示赋值成功;返回 false 或抛出错误则赋值失败(严格模式下会报 TypeError)
- 和 get 类似,应使用 target[prop] = value 写入,避免 proxy[prop] = value 导致无限循环
- 可用于数据校验、日志记录、响应式更新等
示例:
const data = {};const proxy = new Proxy(data, {
set(target, prop, value) {
if (typeof value !== 'string') {
console.warn(`${prop} 必须是字符串`);
return false;
}
target[prop] = value;
console.log(`已设置 ${prop}: ${value}`);
return true;
}
});
proxy.name = 'Alice'; // ✅ 日志输出
proxy.age = 25; // ❌ 警告 + 赋值失败
注意陷阱:in、hasOwnProperty、for...in 的拦截
仅靠 get/set 不会拦截 in 操作符或 Object.prototype.hasOwnProperty,它们由 has trap 控制;for...in 遍历由 ownKeys 和 getOwnPropertyDescriptor 共同影响。
- 想让 in 检查返回 false,需在 has 中返回 false
- 想隐藏某个属性不被遍历,ownKeys 应排除它,且 getOwnPropertyDescriptor 需返回 configurable: false 或不定义该属性
- 这些 trap 需配合使用才能实现“完全隐藏”效果
实际建议:别过度代理,优先封装逻辑
Proxy 是强大工具,但不是万能替代品。日常开发中:
- 简单校验或计算属性,直接用 getter/setter 更轻量
- 复杂拦截(如响应式系统)才值得用 Proxy,且要注意性能开销和兼容性(IE 不支持)
- 避免代理整个全局对象或大型嵌套结构,按需代理关键字段
- 调试时可用 console.log 在 trap 中打点,但上线前建议移除或收敛日志
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










