Object.getPrototypeOf()是获取对象原型最安全标准的方式,直接返回对象内部[[Prototype]],规避了__proto__弃用、constructor不可靠等问题,适用于普通对象、内置对象等,对null/undefined抛错,原始值自动装箱,无原型则返回null。

Object.getPrototypeOf() 是获取对象原型最安全、标准的方式,它直接返回指定对象的内部 [[Prototype]](即其原型对象),不依赖构造函数或 __proto__ 这类非标准或已弃用的属性。
为什么推荐用 Object.getPrototypeOf 而不是其他方式
它规避了几个常见风险:
-
obj.__proto__是历史遗留属性,虽被广泛支持但已被 ES 规范标记为“deprecated”,不建议在生产代码中使用; - 通过
obj.constructor.prototype获取原型不可靠——因为constructor属性可被改写,且原型链上中间对象的constructor可能指向错误构造函数; -
Object.getPrototypeOf()是 ECMAScript 标准方法,行为稳定、语义明确,且对所有普通对象、内置对象(如数组、日期)甚至 null/undefined 以外的对象都适用。
基本用法与典型场景
直接传入目标实例即可:
```jsconst arr = [1, 2, 3];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
function Person(name) { this.name = name; }
const p = new Person('Alice');
console.log(Object.getPrototypeOf(p) === Person.prototype); // true
```
处理边界情况的注意事项
该方法对特殊值有明确定义:
立即学习“Java免费学习笔记(深入)”;
- 传入
null或undefined会抛出TypeError(必须是对象类型); - 传入原始值(如字符串、数字)时,会自动装箱为对应包装对象,再取其原型(例如
Object.getPrototypeOf("hello")返回String.prototype); - 若对象无显式原型(如
Object.create(null)创建的对象),则返回null,这是合法且预期的行为。
配合原型链遍历的实用技巧
常与 Object.getPrototypeOf() 和 Object.prototype.isPrototypeOf() 配合判断继承关系:
function isInstanceOf(obj, constructor) {
let proto = Object.getPrototypeOf(obj);
while (proto !== null) {
if (proto === constructor.prototype) return true;
proto = Object.getPrototypeOf(proto);
}
return false;
}
```
这种写法比直接查 constructor 更健壮,也更贴近 instanceof 的底层逻辑。


















