原型链是javascript实现继承的底层机制,通过对象间委托关系运行:访问属性时先查自身,再沿__proto__逐级向上查找至object.prototype(终点为null),所有对象由此共享tostring等方法;其三大核心是函数的prototype属性、对象的__proto__属性及constructor属性,es6 class仅为语法糖。

原型链是 JavaScript 实现继承的底层机制,不是语法糖,而是运行时真实存在的对象查找路径。它不依赖“类”概念,而是靠对象之间的委托关系——一个对象找不到属性时,自动向它的原型对象“求助”,层层向上,直到尽头。
原型链的三个关键角色
理解原型链,得盯住三样东西:
-
函数的 prototype 属性:只有函数才有。它是一个对象,存放所有实例共享的方法和属性。比如
function Person() {},Person.prototype就是将来每个new Person()实例的“公共模板”。 -
对象的 __proto__ 属性:每个对象(包括函数)都有。它指向创建该对象的构造函数的
prototype。例如const p = new Person(),那么p.__proto__ === Person.prototype为真。 -
constructor 属性:默认存在于
prototype上,指回原构造函数。它不是用来“反向找构造函数”的可靠依据(可被改写),但能体现原型与构造函数的初始绑定关系。
原型链是怎么跑起来的
当你写 obj.method(),JavaScript 并不是直接去 obj 里翻,而是走一条固定路线:
- 先查
obj自身有没有method; - 没有?就看
obj.__proto__有没有; - 还没有?再看
obj.__proto__.__proto__(也就是Object.prototype); - 再没有?
Object.prototype.__proto__是null,查找结束,返回undefined。
这条从实例出发、逐级往上跳的路线,就是原型链。所有普通对象最终都连到 Object.prototype,所以都能用 toString()、hasOwnProperty() 这些方法——它们就挂在那儿。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
为什么说它是继承的基石
所谓“继承”,在 JavaScript 里本质是“属性访问委托”。没有复制父类字段,也没有生成新类结构,只是让子对象的 __proto__ 指向父类的原型对象,从而复用其方法。
- 代码复用:多个实例共享同一份方法,节省内存;
- 动态修改:改
Parent.prototype,所有已创建的子实例立刻生效; - 灵活组合:一个对象可以有多个“原型来源”(通过
Object.create()或手动赋值__proto__),不像传统类继承那样僵硬。
ES6 的 class 语法只是把这套逻辑包装得更像 Java,但底层依然靠 prototype 和 __proto__ 驱动。删掉 class,原型链照常工作。
常见误区提醒
别把 prototype 和 __proto__ 搞混:
-
prototype是函数的属性,只属于函数; -
__proto__是对象的属性,所有对象都有; - 二者指向同一个对象(比如
F.prototype === f.__proto__),但语义和归属完全不同。
另外,new Parent() 作为子类原型,会把父类的引用类型属性(如数组、对象)变成所有子实例共享——这是原型链继承的经典陷阱,也是后来组合继承、寄生组合式继承出现的原因。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










