Object.getPrototypeOf()返回对象的直接原型而非整条原型链;需循环调用才能获取完整原型链;它标准安全,区别于非标准__proto__和构造函数.prototype;不接受null/undefined,原始值会被包装。

Object.getPrototypeOf() 是获取对象直接原型的标准方法,它返回对象内部 [[Prototype]] 指向的那个对象(即它的“父级原型”),而不是整个原型链。
一、getPrototypeOf 获取的是“直接原型”,不是整条链
每个对象都有一个内部属性 [[Prototype]],它指向该对象的原型对象。Object.getPrototypeOf(obj) 就是读取这个内部属性的值。
- 对普通对象,它通常返回
Object.prototype - 对数组,返回
Array.prototype - 对函数,返回
Function.prototype - 对用
class创建的实例,返回对应类的prototype
例如:
const obj = {};console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
const arr = [];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
二、想遍历整条原型链?需要循环调用 getPrototypeOf
因为 getPrototypeOf 只返回一级,要拿到完整链条,得反复调用,直到结果为 null(原型链终点)。
立即学习“Java免费学习笔记(深入)”;
- 每次调用都向上走一层
- 当返回
null时,说明已到顶(Object.prototype的原型就是null)
简单实现:
function getPrototypeChain(obj) {const chain = [];
let current = obj;
while (current !== null) {
chain.push(current);
current = Object.getPrototypeOf(current);
}
return chain;
}
// 使用:getPrototypeChain({}) 返回 [ {}, Object.prototype ]
三、注意与 __proto__ 和 constructor.prototype 的区别
Object.getPrototypeOf(obj) 是标准、安全、推荐的方式;而:
-
obj.__proto__是非标准但广泛支持的访问方式(不建议在生产中使用) -
Constructor.prototype是构造函数的prototype属性,仅对通过该构造函数创建的对象“相关”,但它不等于对象自身的原型(除非没被修改过)
比如:
function Foo() {}const f = new Foo();
console.log(Object.getPrototypeOf(f) === Foo.prototype); // true
console.log(Foo.prototype.constructor === Foo); // true
四、特殊情况:null 和原始值不能用 getPrototypeOf
Object.getPrototypeOf() 只接受对象类型参数:
- 传入
null或undefined会抛出 TypeError - 传入原始值(如字符串、数字)会被自动包装,返回对应包装类型的原型(如
String.prototype)
例如:
Object.getPrototypeOf("hello"); // String.prototypeObject.getPrototypeOf(42); // Number.prototype
Object.getPrototypeOf(null); // TypeError!


















