Proxy 的核心陷阱是 get 和 set,但必须配合 has 和 ownKeys 才能确保 in 操作符、for...in 和 Object.keys() 行为一致;get/set 用于读写控制与转发,has 控制 in 判断,ownKeys 决定枚举结果;Proxy 不拦截 JSON.stringify、Object.assign 等非语言级操作。

JavaScript 的 Proxy 对象通过定义“陷阱”(trap)来拦截对目标对象的属性访问,核心是 get 和 set 两个操作,但仅靠它们还不够完整——必须配合 has 和 ownKeys 才能让行为真正符合直觉。
用 get 拦截读取:控制属性值和 this 绑定
get(target, prop, receiver) 在执行 obj.prop、obj['x'] 或调用原型上 getter 方法时触发。关键点在于:
- 必须显式返回值,否则结果为
undefined - 推荐用
Reflect.get(target, prop, receiver)转发默认行为,它能正确处理this指向和原型链查找 -
receiver是代理对象本身,影响 getter 内部的this,不能忽略 - 可在此做权限检查、日志记录、默认值兜底或计算属性推导
用 set 拦截赋值:决定是否允许写入
set(target, prop, value, receiver) 在执行 obj.prop = val 时触发。注意:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 必须返回
true表示赋值成功;返回false或不返回,在严格模式下会抛TypeError - 同样建议用
Reflect.set()转发,避免绕过 setter 或破坏不可写属性约束 - 适合做数据校验(如邮箱格式)、只读字段拦截、变更通知(如响应式更新)
- 若想禁止新增属性,需结合
preventExtensions或defineProperty控制
补全 in 和枚举行为:has 与 ownKeys 不可省略
仅实现 get 和 set,prop in obj、for...in、Object.keys() 仍走原对象逻辑,容易导致行为不一致:
立即学习“Java免费学习笔记(深入)”;
-
has(target, prop)控制in操作符结果,比如隐藏私有属性(_id)、模拟“不存在”语义 -
ownKeys(target)决定哪些键会被Object.getOwnPropertyNames()和Reflect.ownKeys()返回,包括 Symbol 和不可枚举属性也得手动列出 - 若未实现
ownKeys,for...in可能漏掉本应继承的可枚举属性
注意 Proxy 的能力边界
Proxy 并非万能,它只拦截明确的语言级操作:
-
JSON.stringify(proxy)不触发任何 trap,只序列化自有可枚举属性 -
Object.assign({}, proxy)内部使用 [[Get]],会走get,但不调用ownKeys,可能遗漏属性 - Date、RegExp、Promise 等内置对象的内部状态无法被拦截,代理后行为可能异常
- 原型链本身不被修改,
getPrototypeOf需单独拦截才能改变instanceof或__proto__表现

















