JS的class继承通过extends和super实现,本质是原型链,要求显式声明继承、构造函数首行调用super(),支持方法重写与super调用、静态成员及访问器继承。

JS 的 class 语法通过 extends 和 super 实现继承,本质仍是原型链机制,但写法更清晰、语义更明确。关键不是“复制父类”,而是让子类实例能顺着原型链查找到父类的方法和属性,同时支持自身定制。
必须用 extends 声明继承关系
子类定义时需显式使用 extends 父类名,否则无法调用 super(),也无法获得父类原型上的方法:
-
class Dog extends Animal表示 Dog 是一种 Animal,满足 “is-a” 关系 - 若省略
extends,即使手动设置Dog.prototype.__proto__ = Animal.prototype,也不符合 class 语义,且无法在构造函数中用super() - JavaScript 不支持多继承,
extends只能跟一个类(或null)
构造函数里必须先调用 super()
子类构造函数中,只要写了 constructor,就必须在访问 this 前调用 super() —— 这是 JS 强制的初始化流程:
-
super(name)相当于执行Animal.call(this, name),把父类实例属性挂到当前this上 - 不调用
super()会报错ReferenceError: Must call super constructor - 如果子类没写
constructor,JS 会自动补一个constructor(...args) { super(...args); }
用 super 调用父类方法实现能力增强
子类可重写父类方法,同时通过 super.方法名() 复用并扩展逻辑,这是“扩展能力”的核心操作:
- 比如重写
speak():先super.speak()执行父类基础行为,再追加子类特有动作 -
super在方法内部指向父类原型,所以super.speak查找的是Animal.prototype.speak - 注意不能在箭头函数中用
super,因为箭头函数没有自己的this和super绑定
静态方法和 getter/setter 同样可继承与覆盖
父类的 static 方法、get/set 访问器也会被子类继承,且可用 super 访问:
-
class Animal { static create() { return new this(); } }→Dog.create()返回 Dog 实例 - 子类可定义同名
static create(),内部用super.create()复用父逻辑 - getter 中写
return super.name + ' (dog)'是合法且常见的增强方式


















