推荐使用 object.getprototypeof() 而非 __proto__,因其是 es5 标准方法,语义明确、兼容性好、严格模式可用,且不依赖可枚举属性,对非法输入抛错便于调试,与 setprototypeof 配套构成完整原型操作接口。

直接调用 Object.getPrototypeOf() 并传入实例对象,就能规范、安全地获取其原型对象。这是 ES5 引入的标准方法,替代了非标准的 __proto__ 属性,兼容性好且语义明确。
为什么推荐用 Object.getPrototypeOf() 而不是 __proto__
__proto__ 是早期浏览器实现的私有属性,虽被广泛支持,但不属于 ECMAScript 标准,已被标记为“已弃用”(deprecated)。而 Object.getPrototypeOf() 是官方标准 API,行为稳定、可移植性强,且在严格模式下仍完全可用。
- 不依赖对象是否具有可枚举的
__proto__属性 - 对 null 或原始值输入会抛出 TypeError,便于早期发现错误
- 与
Object.setPrototypeOf()配套使用,构成完整的原型操作接口
基本用法:传入实例对象即可
只要传入一个普通对象或函数实例,该方法就返回它的内部 [[Prototype]] 指向的对象:
const obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
<p>function Foo() {}
const foo = new Foo();
console.log(Object.getPrototypeOf(foo) === Foo.prototype); // true
</p>
注意:不能传入 null 或 undefined,否则会报错;字符串、数字等原始值需先包装成对象才能使用(如 Object.getPrototypeOf(new String('a')))。
常用于原型链遍历和类型判断
配合 Object.getPrototypeOf() 和 === 可精准判断实例是否直接继承自某原型:
- 检查是否为数组实例:
Object.getPrototypeOf(arr) === Array.prototype - 沿原型链向上查找:
let proto = Object.getPrototypeOf(obj); while (proto) { /* 处理 */ proto = Object.getPrototypeOf(proto); } - 避免误用
instanceof在跨 iframe 场景失效的问题(因构造函数不共享)
与 constructor.prototype 的区别
不要混淆 Object.getPrototypeOf(obj) 和 obj.constructor.prototype:
- 前者直接读取内部 [[Prototype]],结果确定、不可伪造
- 后者依赖
constructor属性,而该属性可被修改或丢失(如obj.constructor = null),导致结果不可靠 - 子类继承时若未正确修复
constructor,obj.constructor.prototype可能指向父类原型
因此,需要严谨获取原型时,始终优先使用 Object.getPrototypeOf()。










