ES6 Proxy通过handler的get/set陷阱拦截属性读写,核心是重定向操作到自定义逻辑;get触发于读取时,需返回值,常配合Reflect.get;set触发于赋值时,须返回布尔值,常配合Reflect.set;仅代理实例有效,直接操作target无效。

ES6 中 Proxy 通过 handler 对象里的 get 和 set 陷阱(traps) 拦截属性读写,核心是把操作“重定向”到自定义逻辑,再决定是否、如何访问或修改目标对象。
拦截属性读取:用 get 方法
get 会在访问 proxy[property] 或 proxy.prop 时触发,接收三个参数:target(原对象)、property(属性名)、receiver(代理本身或继承链对象)。
- 必须显式返回值,否则默认返回 undefined
- 通常需返回
target[property]保持原有行为,也可做校验、日志、默认值兜底等 - receiver 参数在涉及原型链或 this 绑定时很重要,推荐传给 Reflect.get 保证语义一致
示例:
const target = { x: 10 };const proxy = new Proxy(target, {
get(target, prop) {
console.log('读取', prop);
return prop in target ? target[prop] : '未定义';
}
});
proxy.x // 输出 "读取 x",返回 10
proxy.y // 输出 "读取 y",返回 "未定义"
拦截属性写入:用 set 方法
set 在执行 proxy.prop = value 或 proxy[prop] = value 时触发,接收四个参数:target、property、value、receiver。
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
- 必须返回布尔值:true 表示赋值成功,false 表示失败(严格模式下会报错)
- 通常用
target[property] = value完成实际赋值,也可加校验、转换、拒绝非法写入 - 同样建议配合 Reflect.set 使用,避免遗漏原型或 setter 行为
示例:
const data = {};const proxy = new Proxy(data, {
set(target, prop, value) {
if (typeof value !== 'string') {
console.warn('只允许字符串值');
return false;
}
target[prop] = value.toUpperCase();
return true;
}
});
proxy.name = 'alice'; // 成功,data.name → 'ALICE'
proxy.age = 25; // 警告,赋值失败
注意:必须操作 Proxy 实例,不能直接操作 target
Proxy 的拦截只对 proxy 对象本身有效。如果绕过 proxy 直接读写 target,所有拦截逻辑完全失效。
- ✅ 正确:proxy.count++、proxy.name = 'Tom'
- ❌ 无效:target.count++、target.name = 'Tom' —— 不触发任何 trap
- ⚠️ 副作用:修改 target 可能导致 proxy 与 target 状态不一致,尤其在响应式系统中要避免
进阶建议:搭配 Reflect 使用更安全
Reflect.get / Reflect.set 是专为 Proxy 设计的配套 API,能更准确复现默认行为,尤其处理 getter/setter、原型链、this 绑定时更可靠。
- 推荐写法:
Reflect.get(target, prop, receiver)替代target[prop] - 推荐写法:
Reflect.set(target, prop, value, receiver)替代target[prop] = value - 这样既保留原语义,又便于未来扩展(比如统一日志、权限检查)

















