proxy 构造函数要求 target 必须是对象(含 null),基本类型直接报错;handler 必须是对象,trap 需遵守返回契约;不可省略 new 关键字。

JavaScript 中 Proxy 构造函数本身没有“语法层面”的限制,但它对传入参数有明确且不可绕过的约束——尤其是 target 必须是对象(Object)类型,否则会立即抛出 TypeError。
target 必须是可代理的对象
Proxy 只能代理引用类型:普通对象、数组、函数、Map、Set、Date、RegExp,甚至另一个 Proxy 也行。但以下类型绝对不可作为 target:
- 基本类型:
number、string、boolean、null、undefined、symbol、bigint - 尝试代理会直接报错:
new Proxy(42, {})→TypeError: Cannot create proxy with a non-object target - 注意:
new Proxy({}, {})合法;new Proxy(null, {})也合法(null是特殊允许的“对象”占位符,但实际操作中多数 trap 会因target为null而失败,需谨慎)
handler 必须是对象,且 trap 返回值有隐含契约
handler 参数虽可为空对象({}),但一旦定义某个 trap,就必须遵守其返回约定:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
set必须返回true表示赋值成功,否则严格模式下触发TypeError -
get、has、ownKeys等 trap 的返回值类型有规范要求(如ownKeys必须返回数组,且必须包含所有不可配置属性) - handler 本身不能是
null或原始值,否则报错:new Proxy({}, null)→TypeError: Cannot convert undefined or null to object
不能代理基本类型的“自动装箱”结果
虽然 new String("a")、new Number(123) 是对象,技术上可被代理,但极易失效:
- 一旦参与运算或隐式转换(如
proxy + "!"),就会触发toString()或valueOf(),返回基本类型值,脱离代理控制 - 代理的是包装对象实例,不是原始字符串/数字本身;而 JS 中绝大多数上下文使用的是原始值,不是包装对象
- 因此不建议用 Proxy 包装基本类型包装器——看似可行,实则不可靠
new 是强制语法,不可省略
Proxy 是构造函数,调用时必须使用 new 关键字:
-
const p = new Proxy(obj, handler)✅ -
const p = Proxy(obj, handler)❌ 抛出TypeError: Class constructor Proxy cannot be invoked without 'new'
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










