javascript原型链是对象通过__proto__逐级向上引用的真实路径:实例.__proto__→构造函数.prototype→object.prototype→null,其中__proto__是对象的内部链接,prototype是函数的属性模板,二者不可混淆。

要真正看清 JavaScript 原型链的底层结构,关键不是背概念,而是顺着对象的 __proto__ 一级级“摸上去”,看清每一环指向谁、为什么这么指。它不是抽象的理论链条,而是一条可观察、可验证的真实引用路径。
__proto__ 是对象通往原型的“梯子”
__proto__ 是每个普通对象(除 null/undefined)都有的内部链接,它不负责定义行为,只负责指路——明确告诉引擎:“我的上一级原型是这个对象”。它不是函数专属,而是所有实例对象的标配。
- 你用
new Person()创建实例,该实例的__proto__就指向Person.prototype; - 你用
let arr = []创建数组,arr.__proto__指向Array.prototype; - 你用
let obj = {}创建空对象,obj.__proto__指向Object.prototype。
顺着 __proto__ 一级级往上查,就是原型链的实操过程
不需要画图或死记,直接在控制台敲几行就能还原整条链:
const p = new Person('Alice');-
p.__proto__ === Person.prototype→ true(第一级) -
p.__proto__.__proto__ === Object.prototype→ true(第二级) -
p.__proto__.__proto__.__proto__ === null→ true(终点)
这就是最简明的原型链:对象 → 构造函数原型 → Object.prototype → null。每一步都是真实存在的引用,不是虚拟路径。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
区分 prototype 和 __proto__,避免混淆源头
很多人卡住,是因为把两个东西混成一个:
- prototype 只属于函数,是函数身上一个叫 “prototype” 的属性,它是一个对象,用来当“模板”供实例继承;
-
__proto__ 属于对象(包括函数本身也是对象),是对象身上的一个内部链接,值等于它“爸爸”的
prototype。
比如:function Foo() {},那么 Foo.__proto__ === Function.prototype(因为 Foo 是函数,由 Function 构造),而 Foo.prototype 是另一个独立对象,供 new Foo() 出来的实例使用。
Object.prototype 是所有链的公共终点
无论你从数组、日期、正则还是自定义构造函数出发,只要一路顺着 __proto__ 往上走,最终都会撞到同一个对象:Object.prototype。它的 toString、hasOwnProperty、isPrototypeOf 等方法,正是所有对象都能用的原因。
再往上: Object.prototype.__proto__ 是 null —— 这不是错误,是设计终点。JavaScript 查找属性时,走到 null 还没找到,就自然返回 undefined,整个机制闭环完成。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










