要获取内置类实例的完整原型链,必须从实例出发循环调用object.getprototypeof,直到object.prototype为止;直接对构造函数调用得到的是function.prototype,而非其实例的原型链。

直接用 Object.getPrototypeOf 获取内置类(如 Array、Date、Promise 等)的原型链,不能只调一次——它只返回**直接父级原型**,而原型链是层层向上追溯的。要看到完整结构(直到 Object.prototype 为止),需要循环调用,且注意排除 Object 自身的原型(即 null)。
获取某个内置构造函数实例的完整原型链
关键不是传构造函数本身(如 Array),而是传它的实例(如 [] 或 new Date()),因为 Object.getPrototypeOf 接收的是对象,不是函数。
- 先创建一个实例,比如
const arr = []; - 用
let proto = Object.getPrototypeOf(arr);开始,然后不断取Object.getPrototypeOf(proto) - 停止条件是
proto === null或proto === Object.prototype(通常到Object.prototype就终止,再往上就是null)
常见内置类的典型原型链示例
以 [] 为例,链路为:Array.prototype → Object.prototype → null
以 new Date() 为例:Date.prototype → Object.prototype → null
以 Promise.resolve() 为例:Promise.prototype → Object.prototype → null
注意:Function、RegExp、Map 等也都是直接继承自 Object.prototype,不经过额外中间层(ES6+ 的内置类基本都如此,没有像 Error 那样多一层 Error.prototype 的情况)。
写个通用函数打印原型链(不含 Object 构造函数本身)
下面这个函数接收任意对象,返回从其自身原型开始、直到 Object.prototype 的所有原型(不包括 Object 构造函数,也不含 null):
function getPrototypeChain(obj) {
const chain = [];
let proto = Object.getPrototypeOf(obj);
while (proto !== null && proto !== Object.prototype) {
chain.push(proto);
proto = Object.getPrototypeOf(proto);
}
chain.push(Object.prototype); // 显式加上 Object.prototype
return chain;
}
调用 getPrototypeChain([]) 会返回 [Array.prototype, Object.prototype];getPrototypeChain(/a/g) 返回 [RegExp.prototype, Object.prototype]。
为什么不能直接对 Array 等构造函数调用?
Object.getPrototypeOf(Array) 返回的是 Function.prototype,因为 Array 本身是个函数(构造器),属于 Function 实例。这不是你想要的“数组实例的原型链”,而是“构造函数对象自身的原型”。想查实例行为,必须从实例出发。
简记:查“它是什么类型”的原型链,就用它的实例;查“它作为函数”的身份,才用构造函数本身——但那属于另一条链(函数对象的继承链)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











