ES6的extends通过super()调用父类构造函数初始化实例属性,并自动设置原型链继承方法,天然实现组合继承目标,避免ES5中父类构造函数重复执行的问题。

ES6 的 extends 本身不直接实现“组合继承”这个 ES5 模式,但它通过寄生组合式继承的底层机制,天然支持组合继承的核心目标:既复用父类构造函数初始化实例属性,又复用父类原型上的方法——而且更简洁、更可靠。
继承构造逻辑 + 共享原型方法
组合继承在 ES5 中要手动组合「借用构造函数」和「原型链继承」两步。ES6 的 extends 把这两步自动完成:
-
调用
super()相当于“借用构造函数”:确保子类实例拥有父类初始化的属性(如this.name、this.colors),避免原型上引用类型被共享 -
原型链自动连接:引擎内部执行
Object.setPrototypeOf(SubClass.prototype, SuperClass.prototype),让子类原型能访问父类所有实例方法,无需手动赋值SubClass.prototype = Object.create(SuperClass.prototype)
必须写 super(),否则 this 不可用
子类构造函数中,super() 不只是可选语法糖,而是强制步骤:
- 不调用
super(),子类无法获得this,会报ReferenceError: Must call super constructor -
super()的作用是创建并返回父类的this实例,子类在此基础上添加自有属性(比如this.breed) - 参数需与父类构造函数匹配,例如
super(name, age),否则父类初始化逻辑失效
静态方法和原型方法都自动继承
组合继承关注的是实例属性 + 原型方法的双重复用,ES6 extends 同时覆盖这两层:
- 实例方法(定义在
Parent.prototype上)自动出现在子类实例上 - 静态方法(定义在
Parent类本身)也通过Object.setPrototypeOf(Child, Parent)被继承,可直接调用Child.staticMethod() - getter/setter、
Symbol方法等同样继承,无需额外操作
避免 ES5 组合继承的重复调用问题
ES5 组合继承有个经典缺陷:父类构造函数会在原型链设置和实例初始化时各执行一次。ES6 彻底规避了这点:
- 父类构造函数只在
super()中调用一次,严格对应实例创建场景 - 原型链设置是独立的元操作(修改
__proto__),不触发构造函数 - 因此不会出现
this.colors被意外覆盖或重复 push 的问题


















