proxy 不自动拦截原型链,需在 get、has、getprototypeof 等 trap 中显式处理;reflect.get/has 借助 receiver 支持原型链查找;getprototypeof 可自定义返回值以控制 instanceof;proxy 实例可作原型实现链式拦截;set 无法修改原型属性,仅屏蔽。

Proxy 本身不直接拦截原型链,但可以通过 handler 中的特定 trap 主动干预原型相关行为。关键不是“自动拦截”,而是你得在 get、has、getPrototypeOf 等方法里显式处理原型逻辑。
get 和 has 必须手动走原型链
默认情况下,Proxy 的 get 只查目标对象自身属性,不会自动沿原型链查找。要支持继承访问,必须用 Reflect.get(target, prop, receiver) —— 它会自动遵循 receiver 的原型链语义。
- receiver 通常是 proxy 本身,所以 Reflect.get 会从 proxy 开始,按原型链向上找
- 单独写
target[prop]或target[prop] !== undefined会跳过原型,导致继承属性读不到 - has 也一样:直接
prop in target只看自身;要用 Reflect.has(target, prop, receiver) 才能正确判断原型上是否存在
getPrototypeOf 拦截原型访问本身
当代码调用 Object.getPrototypeOf(proxy)、proxy.__proto__ 或触发 instanceof 判断时,会进入 getPrototypeOf trap。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 这个 trap 能让你返回任意原型对象,比如始终返回一个空对象,或动态注入日志逻辑
- 注意:Proxy 实例的
__proto__默认指向Proxy.prototype,不是 target 的原型,所以proxy instanceof SomeClass通常为 false - 若需保持 instanceof 正常,可在 getPrototypeOf 中返回 target 的原型:
return Object.getPrototypeOf(target);
Proxy 可以作为原型被继承
你不仅能代理普通对象,还能把 Proxy 实例设为其他对象的原型,从而让整个原型链上的属性读取都被拦截。
- 例如:
const p = new Proxy({}, { get() { return 'from proto' } }); const obj = Object.create(p); obj.x会触发 p 的 get - 这种用法适合构建通用基类行为,比如统一权限检查、字段脱敏或懒加载逻辑
- 此时 obj 自身无 x,但访问时仍走 proxy 的 trap,真正实现了“原型层拦截”
set 对原型属性修改无效,只能屏蔽
JS 引擎对原型上不可写属性的赋值,不会触发 set trap——它会在 target 上新建自有属性(即“屏蔽”原型属性)。
- 也就是说,
proxy.b = 10如果 b 在原型上且不可配置,实际结果是 proxy 自身多了个 b: 10,原型未变 - 想阻止这种屏蔽行为,得在 set 中主动检查:
if (Object.prototype.hasOwnProperty.call(Object.getPrototypeOf(target), prop)) { throw new Error('Cannot override inherited property'); } - 但要注意:这无法真正修改原型,只能预防误操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










