javascript原型链查找顺序是严格单向线性:先查对象自身,再沿__proto__逐级向上查找至object.prototype,最终到null终止;该路径唯一确定,不支持传统多重继承。

JavaScript 本身不支持传统意义上的多重继承(比如一个类同时继承多个父类),但可以通过原型链实现单链式多级继承,而“多重继承的查找顺序”实际是指:当对象访问某个属性或方法时,引擎沿着原型链逐层向上查找的路径和优先级。这个顺序是严格、确定且唯一的。
原型链查找的本质是单向、线性、自底向上的
JavaScript 的属性/方法查找永远遵循一条路径:
- 先检查对象自身是否拥有该属性(自有属性)
- 没有则顺着
__proto__指向其构造函数的prototype - 再没有就继续查那个
prototype的__proto__,也就是它的父原型 - 如此递进,直到抵达
Object.prototype,其__proto__为null,链终止
这条路径是唯一链条,不是“多个父类并行比对”,所以不存在“选哪个父类先”的歧义。例如:
const graduate = new GraduateStudent('Alice', 25, 'AI');它的原型链是:
graduate → GraduateStudent.prototype → Student.prototype → Person.prototype → Object.prototype → null
调用 graduate.sayName() 时,引擎只按这个顺序找,不会跳到其他无关原型上。
为什么看起来像“多重继承”?其实是共享原型的叠加效果
有些场景让人误以为有“多重继承”,比如:
- 给
Student.prototype混入(mixin)了工具对象的方法 - 用
Object.assign(Student.prototype, EventEmitter.prototype)复制方法 - 手动把多个对象的属性拷贝到同一个
prototype上
但这只是属性复制,不是建立多条原型链。所有方法最终都落在 Student.prototype 这一层,查找时仍只走那一条线——它没新增任何 __proto__ 链路,只是让这一层“变胖”了。
constructor 和 instanceof 的判定也依赖同一条链
instanceof 判断的是:右边构造函数的 prototype 是否出现在左边对象的原型链中。
-
graduate instanceof GraduateStudent→ 查GraduateStudent.prototype是否在链上 ✅ -
graduate instanceof Student→ 查Student.prototype是否在链上 ✅ -
graduate instanceof Array→ 查Array.prototype是否在链上 ❌(不在那条线上)
这再次印证:判断依据是单一路径是否存在某节点,而非多个源头择一匹配。
ES6 class 继承没改变查找逻辑,只是语法糖
写成:
class GraduateStudent extends Student { ... }底层仍是设置 GraduateStudent.prototype.__proto__ = Student.prototype,链路不变。所谓“多级”只是链更长,不是分支更多。
真正想模拟多重继承,得靠组合(composition)、mixin 或代理(Proxy),而不是拉长原型链。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











