javascript原型链本质是对象通过[[prototype]]指针构成的单向查找路径;核心在于函数的prototype(显式对象)与对象的__proto__(内部指针)二者指向关系,所有对象最终都连至object.prototype。

JavaScript 中原型链的本质,就是对象之间通过内部指针([[Prototype]])串起来的一条查找路径。它不是语法结构,也不是设计模式,而是一种底层运行时机制——每个对象都悄悄“记住”自己该往哪儿找属性,这个“记忆”就是指针。
原型链的核心是两个关键指针
理解本质,先抓住两个不可混淆的指针:
-
函数的
prototype:只属于函数(包括构造函数),是一个显式存在的普通对象,用来存放将来要被实例共享的方法和属性。 -
对象的
__proto__(或[[Prototype]]):每个对象(包括函数本身、数组、普通对象等)都有这个内部指针,它指向自己的“原型对象”,也就是它继承行为的来源。
这两者不是同一个东西,但构成链接关系:实例.__proto__ === 构造函数.prototype。这个等号背后,就是一次指针赋值——new 实例时,引擎自动把实例的 [[Prototype]] 指向构造函数的 prototype 对象。
原型链是一条单向查找路径,不是双向关系
指针只朝一个方向走:从当前对象 → 它的原型 → 原型的原型 → …… → Object.prototype → null。它不回头,也不跳转,纯粹线性向上追溯。
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
- 访问
obj.name时,引擎先查obj自身属性表;没找到,就顺着obj.__proto__去查;还没找到,再顺着obj.__proto__.__proto__继续查。 - 整个过程就像沿着一条单向地铁线逐站询问,每站(对象)只负责回答“有没有这个属性”,不负责转发或调度。
- 链的终点固定:
Object.prototype.__proto__ === null,这是硬编码的终止信号,不是约定,而是引擎实现。
所有对象最终都连到同一个根节点
无论你用 new Object()、字面量 {}、new Date() 还是自定义构造函数创建对象,它们的原型链最终都会交汇到 Object.prototype。
- 普通对象:
{a:1}.__proto__ → Object.prototype → null - 数组:
[].__proto__ → Array.prototype → Object.prototype → null - 函数:
function f(){}.__proto__ → Function.prototype → Object.prototype → null
这意味着 toString、hasOwnProperty 等通用方法之所以“到处都能用”,不是因为语言特殊照顾,而是因为所有对象都通过指针间接连到了同一个提供这些方法的对象上。
指针链接可被动态修改,但不推荐随意改动
__proto__ 是可写的(尽管已不推荐直接使用),说明这条链在运行时是活的:
-
obj.__proto__ = otherObj会立刻改变查找起点; -
Object.setPrototypeOf(obj, otherObj)是更规范的修改方式; - 但频繁改指针会影响性能(V8 等引擎会失效内联缓存),也破坏可预测性,日常开发中应避免。
真正稳定的链接,是在创建对象时由 new、Object.create() 或字面量语法一次性设定好的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










