Proxy 通过 get 拦截器实现对象属性读取拦截,需在 handler 中定义 get(target, prop, receiver) 方法,支持日志、权限控制、响应式等场景,推荐使用 Reflect.get 保证 receiver 正确传递。

Proxy 可以通过 get 拦截器实现对象属性读取的拦截,这是最常用也最直接的方式。
使用 get 拦截器捕获属性访问
创建 Proxy 时传入一个 handler 对象,在其中定义 get(target, prop, receiver) 方法。每当访问代理对象的属性(如 proxy.x、proxy['y'] 或解构 {z} = proxy)时,该方法就会被触发。
- target 是原始目标对象,读取操作实际发生的地方
- prop 是被访问的属性名(字符串或 Symbol)
-
receiver 通常是 Proxy 实例本身,用于正确处理
this和原型链查找(比如 getter 中的 this 绑定)
基础用法示例
下面是一个简单但完整的例子:
const obj = { name: 'Alice', age: 30 };
const proxy = new Proxy(obj, {
get(target, prop) {
console.log(`正在读取属性: ${prop}`);
return target[prop]; // 默认行为:返回原值
}
});
console.log(proxy.name); // 输出:正在读取属性: name → "Alice"
console.log(proxy.height); // 输出:正在读取属性: height → undefined
支持默认值与属性存在性判断
可以结合 in 操作符或 hasOwnProperty 判断属性是否存在,避免返回 undefined 时无法区分“未定义”和“值为 undefined”:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
立即学习“Java免费学习笔记(深入)”;
- 用
prop in target判断是否为自身或原型上的可枚举属性 - 用
Object.prototype.hasOwnProperty.call(target, prop)严格判断是否为自身属性 - 返回自定义默认值(如 null、空字符串)或抛出错误增强健壮性
注意 receiver 的作用
当目标对象的属性是 getter 时,receiver 决定了 getter 内部 this 的指向。若忽略它,直接返回 target[prop],可能丢失 Proxy 上下文,导致 getter 执行失败或行为异常:
- 正确写法:
return Reflect.get(target, prop, receiver); - 推荐统一使用
Reflect.get,它自动传递 receiver,语义更清晰且兼容性更好
常见用途场景
get 拦截器常用于:
- 响应式系统(如 Vue 3 的 reactive,监听属性访问并收集依赖)
- 日志/调试:记录哪些属性被访问、何时被访问
- 权限控制:对敏感字段(如
password)返回undefined或抛错 - 惰性计算:首次访问时才执行耗时逻辑,并缓存结果
- 代理嵌套对象:递归 wrap 子对象,实现深层响应式

















