JavaScript多级继承需用Object.create()构建原型链并显式调用父构造函数,避免引用共享;每层prototype.__proto__须正确指向父级prototype,最终至Object.prototype→null,同时修复constructor并注入实例属性。

JavaScript 中用原型链模拟多级继承,关键在于让子类的 prototype 指向父类的实例,并确保每层的 __proto__ 链正确串联,最终落到 Object.prototype,再指向 null。它不是“类的层级”,而是“对象的查找路径”逐级向上延伸。
明确构造函数与原型的对应关系
每个构造函数都有自己的 prototype 对象;每个实例都有 __proto__ 指向其构造函数的 prototype。多级继承就是让这条链变长:子 → 父 → 祖父 → Object.prototype → null。
- 定义祖父类(如
Animal),在Animal.prototype上添加通用方法(如eat()) - 定义父类(如
Dog),让它继承Animal:Dog.prototype = Object.create(Animal.prototype),并修复constructor - 定义子类(如
Labrador),同样用Object.create(Dog.prototype)设置原型,并修正constructor
避免直接赋值 new Parent() 带来的引用共享问题
如果写成 Child.prototype = new Parent(),虽然能形成链,但父类构造函数会立即执行,导致所有子类实例共享父类中的引用类型属性(比如数组、对象)。多级时这个问题会被放大。
- 改用
Object.create(Parent.prototype),只继承原型上的方法,不触发父类构造逻辑 - 手动补上
constructor:例如Dog.prototype.constructor = Dog,否则实例的constructor会指向Animal - 若需初始化实例属性(如
this.name),在子类构造函数中用Parent.call(this, ...)显式调用
验证原型链是否真正连通
链是否完整,不能只看代码,要靠运行时检查:
立即学习“Java免费学习笔记(深入)”;
-
labrador.__proto__ === Labrador.prototype✔️ -
Labrador.prototype.__proto__ === Dog.prototype✔️ -
Dog.prototype.__proto__ === Animal.prototype✔️ -
Animal.prototype.__proto__ === Object.prototype✔️ -
Object.prototype.__proto__ === null✔️(这是终点)
也可以用 Object.getPrototypeOf(obj) 逐级获取,比直接访问 __proto__ 更规范。
配合构造函数调用实现真正的属性+方法继承
纯原型链只能继承方法,实例自有属性(如 this.color)必须靠构造函数调用注入:
- 在
Labrador构造函数里写:Dog.call(this, name),再加自己独有的逻辑 - 在
Dog构造函数里写:Animal.call(this),完成向上委托 - 这样每层实例都拥有自己独立的属性,又可通过原型链访问各级方法
这种“组合式”写法(原型链 + 构造函数调用)是模拟可靠多级继承最常用也最稳妥的方式。


















