Proxy不直接拦截原型链,而是通过handler的get/has等trap间接影响原型访问;其__proto__指向Proxy.prototype,导致instanceof失效;需用Reflect.get(target, prop, receiver)自动遵循原型链;Proxy还可作为原型被继承,实现统一拦截逻辑。

Proxy 本身不直接拦截原型链,它拦截的是对代理对象的操作行为;但通过合理设计 handler,可以间接影响原型链上的访问逻辑。
Proxy 不继承目标对象的原型
代理对象的 __proto__ 指向 Proxy.prototype,而非目标对象的构造函数原型。这意味着:
- 用
proxy instanceof SomeClass会返回false,即使 target 是该类实例 - 依赖
isPrototypeOf或Object.getPrototypeOf判断原型关系的代码可能失效 - 代理对象自身没有原型方法,但 get/set 等 trap 可转发到 target,从而“模拟”出原型行为
如何让 Proxy 支持原型链访问
关键是在 handler 的 get 和 has 中主动沿原型链查找:
- 先查 target 自身属性(
prop in target或Object.prototype.hasOwnProperty.call(target, prop)) - 再手动遍历
Object.getPrototypeOf(target)及其上级,直到 null - 或更简洁地使用
Reflect.get(target, prop, receiver)—— 它默认遵循原型链语义
例如:
get(target, prop, receiver) {
return Reflect.get(target, prop, receiver); // 自动走原型链
}
Proxy 作为原型对象的特殊用法
Proxy 实例可以被设为其他对象的原型,此时原型链上的属性读取会被拦截:
立即学习“Java免费学习笔记(深入)”;
const proxy = new Proxy({}, { get() { return 'from proxy' } });const obj = Object.create(proxy);-
obj.xxx触发 proxy 的 get,即使 obj 自身无该属性
这种模式适合构建可复用的、带统一行为的原型层,比如日志基类或权限检查基类。
常见陷阱:原型方法调用被“截断”
当代理数组或内置对象时,容易忽略原型方法(如 push、toString)仍需显式支持:
- 直接调用
proxy.push()会触发 get → 返回包装函数 → 再 apply,必须确保 this 正确绑定到 target - 若 handler 中未处理
applytrap,函数调用可能失败或丢失上下文 - 建议对函数属性统一包装:
typeof value === 'function' ? (...args) => value.apply(target, args) : value


















