proxy 构造函数必须用 new 调用,接收目标对象和处理器对象两个参数;处理器中可定义 get、set 等陷阱函数拦截操作,未定义的陷阱自动转发给目标对象,推荐用 reflect api 转发默认行为。

Proxy 构造函数用于创建一个代理对象,它能拦截并自定义对目标对象的基本操作。核心用法只有一条:必须用 new 调用,传入两个参数——目标对象和处理器对象。
构造函数语法与基本要求
Proxy 的调用方式固定且严格:
- 必须使用
new Proxy(target, handler)形式,直接调用Proxy(target, handler)会抛出TypeError; - target 可以是任意类型:普通对象、数组、函数、Date、RegExp,甚至另一个 Proxy;
- handler 是一个普通对象,其属性为“陷阱”(trap)函数,每个函数对应一种操作的拦截逻辑;
- handler 可以为空对象(
{}),此时 Proxy 行为完全透明,所有操作原样转发给 target。
handler 中常见陷阱及其作用
handler 不需要定义全部陷阱,只写你需要干预的操作即可。未定义的陷阱会自动委托给 target。常用陷阱包括:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
get(target, prop, receiver):拦截读取属性,比如
proxy.name或proxy['age']; -
set(target, prop, value, receiver):拦截赋值操作,如
proxy.count = 10,需返回布尔值(严格模式下 false 会报错); -
has(target, prop):拦截
prop in proxy检查; -
deleteProperty(target, prop):拦截
delete proxy.prop; -
apply(target, thisArg, args):当 target 是函数时,拦截函数调用,如
proxy(1, 2); -
construct(target, args, newTarget):当 target 是构造函数时,拦截
new proxy(...)。
实际使用中的关键细节
几个容易忽略但影响行为的要点:
- 所有 trap 函数中,推荐使用
Reflect.get()、Reflect.set()等反射 API 转发默认行为,而非直接访问或修改 target,这样能正确处理原型链、getter/setter 和 receiver 参数; - receiver 参数在 get/set 中很重要:它通常是 proxy 本身,但在继承场景下可能指向派生对象,影响 this 绑定和 getter 执行上下文;
- Proxy 无法代理原始值(如字符串、数字、布尔值),但可代理它们的包装对象(
new String('a')等),不过一般不这么做; - 一旦创建,Proxy 对象不可撤销(除非显式使用
Proxy.revocable()创建可撤销代理)。
一个最小可用示例
下面代码展示了最简但完整的 Proxy 创建与使用:
const target = { x: 42 };
const handler = {
get(obj, prop) {
console.log('读取属性:', prop);
return obj[prop] ?? '默认值';
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.x); // 读取属性: x → 42
console.log(proxy.y); // 读取属性: y → '默认值'
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










