Proxy 的 getPrototypeOf 拦截器可捕获并自定义原型获取行为,在 Object.getPrototypeOf()、obj.__proto__ 或 Reflect.getPrototypeOf() 调用时触发,需返回对象或 null,配合 setPrototypeOf 可实现可变原型链,适用于调试、兼容层、沙箱和元编程等场景。

可以使用 Proxy 的 getPrototypeOf 拦截器来捕获并自定义对象的原型获取行为,比如在调用 Object.getPrototypeOf()、obj.__proto__(非严格模式)或 Reflect.getPrototypeOf() 时触发。
基本用法:定义 getPrototypeOf 拦截器
在 Proxy 的 handler 中实现 getPrototypeOf 方法,它接收被代理对象作为参数,必须返回一个对象或 null(不能返回原始值)。
示例:
const target = {};
const handler = {
getPrototypeOf() {
console.log('getPrototypeOf 被调用');
return Array.prototype; // 强制返回数组原型
}
};
const proxy = new Proxy(target, handler);
console.log(Object.getPrototypeOf(proxy) === Array.prototype); // true
console.log(Reflect.getPrototypeOf(proxy) === Array.prototype); // true
注意事项与限制
该拦截器有明确的约束,违反会导致 TypeError:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
- 返回值必须是对象或
null,返回undefined、字符串、数字等会报错 - 若目标对象不可扩展(
Object.preventExtensions()),则返回值必须与目标原本的原型严格相等(===) - 若目标是函数且有
@@hasInstance,返回的原型需支持该语义(通常不影响日常使用)
配合 setPrototypeOf 实现可变原型链
单独重写 getPrototypeOf 不足以让 Object.setPrototypeOf() 生效,还需实现 setPrototypeOf 拦截器来控制原型变更,并确保两者逻辑一致。
示例:
let currentProto = Object.prototype;
const handler = {
getPrototypeOf() {
return currentProto;
},
setPrototypeOf(target, proto) {
if (proto === null || typeof proto === 'object') {
currentProto = proto;
return true;
}
return false;
}
};
const proxy = new Proxy({}, handler);
Object.setPrototypeOf(proxy, Array.prototype);
console.log(Object.getPrototypeOf(proxy) === Array.prototype); // true
实际用途举例
这类拦截适合用于:
- 调试工具:记录所有原型访问行为
- 兼容层:统一为不同对象注入相同原型(如模拟旧环境行为)
- 沙箱机制:阻止外部读取敏感原型或返回受控的原型对象
- 元编程框架:构建动态继承关系,例如按运行时条件切换原型

















