JavaScript 中,原型链的**最顶端(终极原型)只有一个——`Object.prototype`

在 JavaScript 中,原型链的最顶端(终极原型)只有一个------Object.prototype ,但你可能会疑惑"两个",核心是混淆了「原型链终点」和「特殊的 null」,或者误将 Function.prototype 当作顶端(实际它也是 Object.prototype 的后代)。

先明确核心结论:原型链的终极顶端是 Object.prototype,而 Object.prototype.__proto__null(原型链的终止标志),这两者共同构成了"顶端的两个关键节点",但本质角色不同(一个是终极原型,一个是终止符)。

1. 真正的终极原型:Object.prototype

所有对象(包括普通对象、数组、函数、日期等)的原型链,最终都会指向 Object.prototype。它是所有对象的"祖先原型",提供了 JavaScript 中最基础的对象方法,比如:

  • toString():将对象转为字符串
  • valueOf():获取对象的原始值
  • hasOwnProperty():判断属性是否是对象自身的(非继承)
  • isPrototypeOf():判断是否是另一个对象的原型

示例验证:任何对象的原型链终点都是它

js 复制代码
const obj = {};
console.log(obj.__proto__ === Object.prototype); // true(普通对象直接指向)
console.log(obj.__proto__.__proto__); // null(原型链终止)

const arr = [];
console.log(arr.__proto__ === Array.prototype); // true(数组的直接原型)
console.log(arr.__proto__.__proto__ === Object.prototype); // true(数组的原型链向上指向)
console.log(arr.__proto__.__proto__.__proto__); // null

2. 原型链的终止标志:null

Object.prototype 是原型链的"最后一个原型对象",但它的 __proto__(原型指针)被设计为 null,目的是终止原型链查找 ------当访问一个对象的属性时,JS 会顺着原型链向上找,直到找到 null 还没找到,就返回 undefined

null 不是一个对象,也没有任何属性/方法,它的角色是"链的尽头",而非"原型对象"。

为什么会误以为"有两个顶端"?

可能是混淆了 Function.prototypeObject.prototype------Function.prototype 是所有函数的直接原型,但它依然是 Object.prototype 的后代,并不是顶端:

js 复制代码
function fn() {}
console.log(fn.__proto__ === Function.prototype); // true(函数的直接原型)
console.log(Function.prototype.__proto__ === Object.prototype); // true(函数原型向上指向终极原型)
console.log(Function.prototype.__proto__.__proto__); // null

甚至 Object 本身是一个构造函数(属于函数),它的原型也指向 Function.prototype,最终还是绕回 Object.prototype

js 复制代码
console.log(Object.__proto__ === Function.prototype); // true
console.log(Function.prototype.__proto__ === Object.prototype); // true

总结(原型链顶端的"两个关键节点")

节点 角色 是否是原型对象
Object.prototype 原型链的终极原型(所有对象的祖先) 是(提供基础方法)
null 原型链的终止标志(链的尽头) 否(无属性/方法)

简单说:原型链的"顶端原型"只有 Object.prototypenull 是链的终止符,两者共同构成了原型链的终点逻辑

相关推荐
傻啦嘿哟7 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670797 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄8 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh8 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei9 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界9 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨10 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J10 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥10 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk55510 小时前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python