Reflect.getPrototypeOf()是ES6引入的标准化方法,用于安全获取对象原型,返回其[[Prototype]]值,参数非对象时抛TypeError,不支持原始值且比__proto__更规范可靠。

Reflect.getPrototypeOf() 是 ES6 引入的静态方法,用于安全、标准地获取指定对象的原型(即其 [[Prototype]] 内部属性),等价于访问 Object.getPrototypeOf(obj),但语义更明确,且在 Proxy 中有对应 trap。
基本用法:直接传入目标对象
只需把要查询的对象作为参数传入即可,返回该对象的原型对象(通常是构造函数的 prototype),如果对象没有原型(如 Object.create(null) 或 null),则返回 null:
-
Reflect.getPrototypeOf({})→Object.prototype -
Reflect.getPrototypeOf([])→Array.prototype -
Reflect.getPrototypeOf(new Date())→Date.prototype -
Reflect.getPrototypeOf(Object.create(null))→null
与 obj.__proto__ 的区别
__proto__ 是非标准、已废弃的访问方式(尽管多数引擎支持),而 Reflect.getPrototypeOf() 是标准化、只读、不可枚举的安全接口:
- 不依赖对象是否暴露
__proto__属性(例如某些冻结或严格模式下的对象) - 不会触发 getter(
__proto__在某些环境中可能被重写为 accessor) - 在 Proxy 中可通过
getPrototypeOftrap 拦截,便于调试或封装
注意边界情况
该方法要求参数必须是对象类型,传入原始值会抛出 TypeError:
-
Reflect.getPrototypeOf("hello")→ 报错:TypeError: "hello" is not an object -
Reflect.getPrototypeOf(42)→ 同样报错 - 若需兼容原始值,可先用
Object(obj)包装(但要注意这会创建包装对象,原型不同)
配合 Proxy 使用示例
在自定义代理时,可拦截原型查询行为:
const obj = {};
const handler = {
getPrototypeOf() {
console.log('原型被查询了');
return Object.prototype;
}
};
const proxy = new Proxy(obj, handler);
Reflect.getPrototypeOf(proxy); // 输出日志,并返回 Object.prototype

















