reflect.getprototypeof()用于获取对象原型,返回其[[prototype]]或null;与object.getprototypeof()行为相同,但对非对象参数抛typeerror而非静默装箱,且是proxy中getprototypeof拦截器的必需调用方式。

Reflect.getPrototypeOf() 用于获取指定对象的原型(即其 [[Prototype]]),返回值是该对象的原型对象,如果对象没有原型则返回 null。它和 Object.getPrototypeOf() 功能一致,但作为 Reflect 的静态方法,设计上更符合“元编程”语义,且在 Proxy 中配合使用更自然。
基本用法和返回值
语法很简单:Reflect.getPrototypeOf(target),其中 target 必须是对象,否则会抛出 TypeError。
- 对普通对象,返回其
__proto__指向的对象(通常是构造函数的prototype) - 对通过
Object.create(null)创建的对象,返回null - 对
Array、Date等内置对象实例,返回对应构造器的原型(如Array.prototype)
与 Object.getPrototypeOf 的区别
两者行为完全相同,但 Reflect 版本有两点实际差异:
- 返回值统一为对象或
null,不会因传入非对象而静默失败(Object.getPrototypeOf(1)会自动装箱并返回Number.prototype;而Reflect.getPrototypeOf(1)直接报错) - 在 Proxy 的
getPrototypeOf拦截器中,必须用Reflect.getPrototypeOf()调用默认行为,不能用Object.getPrototypeOf()
在 Proxy 中的典型配合用法
当自定义原型访问逻辑时,需在 handler 中调用 Reflect.getPrototypeOf 触发默认查找:
const obj = {};
const proxy = new Proxy(obj, {
getPrototypeOf() {
console.log('正在读取原型');
return Reflect.getPrototypeOf(obj); // 必须这样调用,不能写 Object.getPrototypeOf(obj)
}
});
console.log(Object.getPrototypeOf(proxy)); // 输出:{...},同时打印日志
常见错误和注意事项
使用时要注意几个易错点:
- 不能传入原始值(如字符串、数字、
undefined、null),否则立即抛出TypeError - 对函数对象,返回的是
Function.prototype,不是它的prototype属性(后者是用于实例继承的) - ES6 class 的实例调用时,返回的是对应 class 的
prototype,而非class声明本身
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











