继承、super,以及何时优先使用组合
使用 extends 扩展基类,在构造函数中调用 super,安全地重写方法,并了解何时简单组合更合适
继承、super,以及何时优先使用组合 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 3 节课。
整体概览
目标:不混淆地使用基础继承。
- extends 用于创建子类
- super(...) 调用父类构造函数
- 重写方法;也可以选择调用 super.method()
- 如果不是“属于某种类型”的关系,请优先使用组合

extends 与 super
使用 extends 创建子类;调用 super(name) 运行父类构造函数并设置 this。
// Base class with a small field and method
class Animal {
constructor(name) {
this.name = name;
}
info() {
return "Animal:" + this.name;
}
}
// Child class extends the base and calls super(...)
class Dog extends Animal {
constructor(name, breed) {
// must call super() before using this
super(name);
this.breed = breed;
}
speak() {
return "woof";
}
}
const d = new Dog("Milo", "Beagle");
console.log(d.info(), d.speak());

方法重写
重写方法时,您可以调用 super.method() 来复用基础逻辑,然后添加自己的调整。
// Override a method; keep parent behavior with super.method()
class Button {
click() {
return "base-click";
}
}
class IconButton extends Button {
click() {
// call parent behavior, then add something
const base = super.click();
return base + "+icon";
}
}
const b = new IconButton();
console.log(b.click()); // "base-click+icon"

存在包含关系时优先使用组合
如果关系是包含(使用某个辅助工具),请优先使用组合而不是继承,以保持类的简单性。
// Composition: use a helper object instead of extending
class Logger {
log(msg) {
console.log("[log]", msg);
}
}
class Player {
constructor(name, logger) {
this.name = name;
this.logger = logger; // has-a logger
}
score(points) {
this.logger.log(this.name + " +" + points);
}
}
const logger = new Logger();
const p = new Player("Ayla", logger);
p.score(5);

属于某种类型与包含关系
继承表示属于某种类型的关系:Dog 是 Animal。组合用于表示包含辅助工具。
// Use instanceof for a quick is-a check
console.log("Dog is Animal?", d instanceof Animal);
console.log("Player is Animal?", p instanceof Animal);

初学者习惯
提示:
- 对于初学者,让继承层次保持浅。
- 在子类构造函数中首先调用 super(...)。
- 只重写必要的部分;使用 super.method() 进行复用。
- 对于实用工具和横切功能,优先使用组合。

super(...) 基础测验
快速检查:子类构造函数中的 super。

回顾
回顾:对于真正的属于某种类型关系使用 extends,尽早调用 super(...),谨慎重写(有帮助时调用 super.method()),并优先使用组合实现辅助功能。

常见问题解答
「继承、super,以及何时优先使用组合」课时是免费的吗?
是的 — 「继承、super,以及何时优先使用组合」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 3 节课。
「继承、super,以及何时优先使用组合」这节课中我会学到什么?
使用 extends 扩展基类,在构造函数中调用 super,安全地重写方法,并了解何时简单组合更合适 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 JavaScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。
「继承、super,以及何时优先使用组合」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 JavaScript Academy 课中编写并运行代码吗?
能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 类字段、私有 # 字段与静态成员
- 继承、super,以及何时优先使用组合
- 混入(浅尝)——无需深层继承体系的简单复用