原型链终点是 null,object.prototype 是最后一个有值的环节;object.getprototypeof(object.prototype) 返回 null,而 object 本身是函数,其原型为 function.prototype。

可以用 Object.getPrototypeOf 循环获取当前对象的原型,直到返回 null(即到达原型链终点),而 Object.prototype 的原型才是 null。注意:Object 是构造函数,不是原型链上的“终点”,终点是 null;Object.prototype 才是所有普通对象原型链上直接或间接继承的顶层对象。
理解原型链终点是 null,不是 Object
Object.getPrototypeOf(Object.prototype) 返回 null,说明 Object.prototype 是原型链最后一个有值的环节。而 Object 本身是函数,它的原型是 Function.prototype,和普通对象的原型链无关。所以遍历目标应是“从某个对象出发,逐级向上取 [[Prototype]],直到 null”,途中自然会经过 Object.prototype(对大多数对象而言)。
基础遍历写法(含 Object.prototype)
以下代码从任意对象开始,收集整条原型链(包括 Object.prototype),直到 null:
function getPrototypeChain(obj) {
const chain = [];
let current = obj;
while (current !== null) {
chain.push(current);
current = Object.getPrototypeOf(current);
}
return chain;
}
// 示例
const arr = [];
console.log(getPrototypeChain(arr));
// [ [], Array.prototype, Object.prototype, null ]
- 每次迭代把当前对象推入数组,再更新为它的原型
- 循环条件用
current !== null,确保null不被加入,但能终止循环 - 结果中最后一个有效对象是
Object.prototype,下一次getPrototypeOf就是null
只遍历到 Object.prototype(排除 null)
如果明确想停在 Object.prototype(即不包含末尾的 null),可改用:
function getPrototypeChainUpToObject(obj) {
const chain = [];
let current = obj;
while (current !== null && current !== Object.prototype) {
chain.push(current);
current = Object.getPrototypeOf(current);
}
chain.push(Object.prototype); // 显式加上
return chain;
}
- 适合需要严格控制范围、避免
null干扰后续逻辑的场景 - 注意:某些对象(如通过
Object.create(null)创建)没有Object.prototype,需按需加判断
检查是否已到达 Object.prototype
运行时可快速判断当前原型是否为 Object.prototype:
const proto = Object.getPrototypeOf({});
console.log(proto === Object.prototype); // true
console.log(Object.getPrototypeOf(proto) === null); // true
- 用全等(
===)比较最可靠,避免隐式转换问题 -
Object.prototype是唯一一个[[Prototype]]为null的内置对象(除null本身外)











