JavaScript中原型链的顶端是Object.prototype,其[[Prototype]]指向null,这是规范规定的终点,防止无限查找和栈溢出,所有对象最终都到达此处并停止查找。

JavaScript 中原型链的顶端是 Object.prototype,它的 __proto__ 属性(即内部 [[Prototype]])指向 null,这标志着原型链的终点。
为什么 Object.prototype 的原型是 null
这是 JavaScript 规范明确规定的:所有对象最终都继承自 Object.prototype,而它本身不能再继承其他对象。设置其原型为 null 是为了防止无限向上查找,避免循环或栈溢出。
-
Object.prototype.__proto__ === null返回 true - 任何对象(如
{}、new Date()、function() {})沿__proto__一路向上,最终都会到达这里 - 一旦查到
null,属性/方法查找就停止,返回undefined
原型链如何走到 null:一个典型路径
以普通对象为例:
let obj = {};-
obj.__proto__ === Object.prototype✔️ -
Object.prototype.__proto__ === null✔️
再比如数组:
立即学习“Java免费学习笔记(深入)”;
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
let arr = [];arr.__proto__ === Array.prototypeArray.prototype.__proto__ === Object.prototypeObject.prototype.__proto__ === null
不能手动修改 Object.prototype 的原型
虽然技术上可通过非标准方式(如旧版浏览器中的 __proto__ 赋值)尝试修改,但现代环境严格禁止:
-
Object.prototype.__proto__ = {};在严格模式下直接报错 - 即使在非严格模式下,多数引擎也会忽略或抛出异常
- 修改它会破坏整个原型系统,导致
toString、hasOwnProperty等基础方法失效
验证原型链终点的小技巧
可以用递归或循环检查任意对象的原型链终点:
function getPrototypeChainEnd(obj) {
let current = obj;
while (current !== null) {
current = Object.getPrototypeOf(current);
}
return current; // 总是 null
}
或者更直观地打印路径:
function logProtoChain(obj) {
let current = obj;
while (current !== null) {
console.log(current);
current = Object.getPrototypeOf(current);
}
console.log('null'); // 最后一行
}
不复杂但容易忽略:null 不是对象,也不是构造函数,它只是原型链终止的标记。

















