javascript多级继承通过分步设置原型链实现:b.prototype=object.create(a.prototype),c.prototype=object.create(b.prototype),并修复constructor;避免引用共享,用call/apply或super调用父方法,可用instanceof等验证链路。

JavaScript 通过原型链实现多级继承,本质是让子类的 prototype 指向父类的实例(或更准确地说,指向一个以父类为构造函数创建的对象),从而形成一条可逐层向上查找的原型链条。层级越深,查找路径越长,但逻辑一致——只要对象自身没有某个属性或方法,就沿着 __proto__ 一路向上,直到 Object.prototype 或 null。
核心步骤:逐层建立原型链接
要实现 A → B → C 的三级继承(比如 Animal → Mammal → Dog),关键不是“一次性连通”,而是分步设置每级的原型关系:
-
B 的 prototype 必须是 A 的实例:即
Mammal.prototype = new Animal(),这样Mammal实例就能访问Animal.prototype上的方法 -
C 的 prototype 必须是 B 的实例:即
Dog.prototype = new Mammal(),这样Dog实例不仅能访问Mammal.prototype,还能顺着Mammal.prototype.__proto__找到Animal.prototype - 每设置一次
prototype,都要手动修复constructor,否则new Dog()实例的constructor会指向Animal或Mammal,而非Dog
避免引用类型共享问题
直接用 new Parent() 赋值给子类 prototype 会导致所有子类实例共享父类构造函数中的引用属性(如数组、对象)。例如:
父类中 this.colors = ['red'],子类两个实例修改其中一个的 colors,另一个也会变。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
解决办法是:不把父类实例直接赋给 prototype,而用 Object.create(Parent.prototype)。它只继承原型上的方法,不执行父类构造函数,也就不会带入实例属性:
Mammal.prototype = Object.create(Animal.prototype)Dog.prototype = Object.create(Mammal.prototype)- 再分别补上
.constructor = Mammal和.constructor = Dog
确保方法调用时的 this 正确性
多级继承中,子类方法内部若需调用父类同名方法(比如 Dog.speak() 中想复用 Mammal.speak()),不能直接写 Mammal.speak(),因为会丢失 this 绑定。
正确做法是显式用 call 或 apply 调用,并传入当前实例:
-
Mammal.prototype.speak.call(this)(在Dog.prototype.speak内) - 或者更现代的方式:在 ES6 class 中用
super.speak(),底层仍是基于原型链委托
验证继承关系是否生效
写完多级继承后,用这几个方式快速确认链路是否打通:
-
instanceof:如rover instanceof Dog、rover instanceof Mammal、rover instanceof Animal都应返回true -
isPrototypeOf():如Animal.prototype.isPrototypeOf(rover)返回true - 查原型链:
Object.getPrototypeOf(rover) === Dog.prototype,Object.getPrototypeOf(Dog.prototype) === Mammal.prototype,Object.getPrototypeOf(Mammal.prototype) === Animal.prototype
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










