null是原型链的终止标记而非终点对象,它作为[[prototype]]的值表示查找结束;object.prototype才是实际终点,其[[prototype]]被设为null,null本身是原始值,无原型、不可扩展、不能参与继承。

JavaScript中null并不在原型链“终点位置”,它本身不是对象,也不参与原型链查找;真正处于原型链末端的是Object.prototype,而null是其[[Prototype]]的值——即一个**终止标记**,表示“这里没有上一级原型了”。
为什么null出现在__proto__链的末尾?
每个对象(除null和undefined外)内部都有一个隐式原型引用[[Prototype]]。当你访问一个对象上不存在的属性时,引擎会沿着[[Prototype]]一路向上查找,直到遇到[[Prototype]] === null为止。此时停止查找,返回undefined。
例如:
let obj = {};
obj.__proto__ === Object.prototype; // true
Object.prototype.__proto__ === null; // true ← 查找在此终止
null不是对象,也没有原型
null是原始值(primitive),类型为"object"只是历史遗留bug(typeof null === "object"),它不具有[[Prototype]]内部槽,也不能被设置原型(Object.setPrototypeOf(null, ...)会抛错)。因此它不能作为原型链中的“节点”,只能作为链的“哨兵值”。
-
null不能调用.toString()等方法(会报TypeError) -
Object.getPrototypeOf(null)抛出TypeError -
Object.create(null)创建的空对象,其[[Prototype]]直接为null,跳过Object.prototype
Object.prototype才是实际的原型链终点
所有普通对象的原型链最终都会抵达Object.prototype,它提供了toString、valueOf等通用方法。它的[[Prototype]]被显式设为null,这是规范规定的终止条件(ECMAScript §10.2.2)。这个null不是“某个对象”,而是引擎用于判断“查找结束”的信号值。
- 你无法给
null添加属性或方法 - 原型链遍历算法(如
Object.getPrototypeOf循环)靠检测null来退出 - 自定义类/构造函数若未修改原型,其实例链终将落到
Object.prototype → null
小结:null是原型链的“终止符”,不是“终点对象”
它不承载行为,不参与继承,也不可扩展;它的唯一作用是在内部原型指针中表示“无上级原型”。理解这一点,就能明白为何obj.toString()能工作(经由Object.prototype),而null.toString()会失败——因为null根本没有原型链可走。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











