原型链的终点是null,因object.prototype.__proto__===null,引擎据此终止查找并返回undefined;null是结构终点,object.prototype才是提供tostring等方法的功能终点。

JavaScript 原型链的终点不是某个“自定义链式结构”的尽头,而是统一、固定的终点:Object.prototype,再往上就是 null。
原型链的真正终点是 null
虽然 Object.prototype 是所有普通对象可访问到的最后一个具有属性和方法的原型对象(比如 toString、hasOwnProperty),但它自身仍有原型——即 Object.prototype.__proto__ === null。这个 null 才是原型链在内部机制上的终止标志。
- JavaScript 引擎查找属性时,会沿着 __proto__ 链逐级向上,直到遇到 null 才停止并返回 undefined
- Object.prototype 是唯一一个其 __proto__ 指向 null 的内置对象(除少数特殊对象如 null 值本身无原型)
- 即便你用 Object.create(null) 创建“无原型”对象,它也不进入标准原型链,它的 __proto__ 是 undefined,而非 null,但同样无法继续向上追溯
为什么说 Object.prototype 是“功能终点”,而 null 是“结构终点”
从开发者角度看,Object.prototype 提供了所有对象默认可用的基础方法;但从引擎实现看,null 才是链式查找逻辑的硬性截止点。
- console.log({}.toString()) 能成功,是因为 {}.__proto__ → Object.prototype → 有 toString
- console.log({}.__proto__.__proto__) 输出 null,说明链已到底
- 试图访问 null 的任何属性(如 null.toString)会直接报错,因为 null 不是对象,没有属性访问能力
自定义构造函数或 class 不会改变终点
无论你写多少层继承,比如 Animal → Dog → Poodle,原型链最终都会汇入 Object.prototype → null。
- function Dog() {}
Dog.prototype.__proto__ === Object.prototype ✅ - class Poodle extends Dog {}
Poodle.prototype.__proto__ === Dog.prototype ✅
Dog.prototype.__proto__ === Object.prototype ✅ - 即使手动设置 prototype = Object.create(null),该 prototype 本身不再链接到 Object.prototype,但此时它已脱离标准继承体系,也无法使用 toString 等通用方法
如何验证原型链终点
可以用循环 + Object.getPrototypeOf() 安全遍历,直到返回 null:
- let obj = { a: 1 };
while (obj !== null) {
console.log(obj);
obj = Object.getPrototypeOf(obj);
} - 最后一行输出的是 null,这就是链的物理终点
- 注意:不能对原始值(如 42、'abc')或 undefined/null 直接调用 Object.getPrototypeOf,会抛 TypeError
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











