Object.getPrototypeOf用于获取对象的[[Prototype]],不修改对象;对函数如Array返回Function.prototype,对实例如[]返回Array.prototype,最终链至null。

Object.getPrototypeOf 是 JavaScript 中获取对象原型(即其内部 [[Prototype]])的最直接方式。它不修改对象,只读取原型链上的上一级,配合循环调用,就能清晰还原内置函数(如 Array、Promise、RegExp 等)的完整继承路径。
从构造函数开始,拿到它的显式原型
所有函数对象(包括内置构造函数)都有 prototype 属性,但 Object.getPrototypeOf 操作的是**实例或函数本身**的原型,不是它的 prototype 属性。要查内置函数自身的继承关系,应传入该函数本身:
-
Object.getPrototypeOf(Array)→ 返回Function.prototype(因为Array是函数,函数继承自Function) -
Object.getPrototypeOf(Promise)→ 同样是Function.prototype -
Object.getPrototypeOf(Function)→ 返回Function.prototype(函数也是函数,形成自引用)
追踪实例的原型链,看清“new”出来的对象怎么继承
对实例使用 Object.getPrototypeOf,才能看到典型的“类继承”链条。例如:
-
const arr = [];Object.getPrototypeOf(arr)→Array.prototype -
Object.getPrototypeOf(Array.prototype)→Object.prototype -
Object.getPrototypeOf(Object.prototype)→null(终点)
这就是数组实例的标准原型链:[] → Array.prototype → Object.prototype → null。
注意内置构造函数与其实例原型的区别
容易混淆的是:Array 函数本身和 Array.prototype 是两个不同对象,它们的原型也不同:
-
Object.getPrototypeOf(Array)查的是Array这个函数的原型 →Function.prototype -
Object.getPrototypeOf(Array.prototype)查的是数组实例共享的那个原型对象 →Object.prototype -
Array.prototype.constructor === Array,这是连接构造函数与原型的关键纽带
用循环 + toString 快速打印完整原型链
写个小工具函数,自动展开任意对象的原型链:
function logPrototypeChain(obj) {
let current = obj;
while (current !== null) {
console.log(current === obj ? 'start:' : '→', current?.constructor?.name || current?.toString());
current = Object.getPrototypeOf(current);
}
}
试一试:logPrototypeChain(new Promise(() => {})) 会输出:start: Promise → Promise.prototype → Object.prototype → null。
而 logPrototypeChain(Promise) 则显示:start: Function → Function.prototype → Object.prototype → null。

















