では「継承と super」について、アロー関数と通常メソッドの違いを交えながら整理してみましょう。
基本:クラス継承と super
extendsを使うと、あるクラスを親クラスとして継承できる- 子クラスのコンストラクタでは 必ず
super()を呼んで親クラスを初期化する必要がある - 子クラスのメソッド内では
super.メソッド名()で親クラスのメソッドを呼び出せる
例1:通常メソッドでの super
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} が鳴いた`);
}
}
class Dog extends Animal {
// 通常メソッドなら super が使える
speak() {
super.speak(); // 親クラスの speak を呼ぶ
console.log("ワン!");
}
}
const d = new Dog("ポチ");
d.speak();
// 出力:
// ポチ が鳴いた
// ワン!
JavaScript✅ 通常メソッドでは super が有効。親クラスの処理を拡張できる。
例2:アロー関数でのメソッド定義
class Dog extends Animal {
// アロー関数で定義すると…
speak = () => {
// super.speak(); ❌ エラーになる
console.log("ワン!");
};
}
const d = new Dog("ポチ");
d.speak();
// 出力:
// ワン!
JavaScript❌ アロー関数では super が使えない。
理由は、アロー関数は「インスタンスのプロパティに関数を代入しているだけ」なので、super の解決スコープを持たないから。
実務的な使い分け
- 通常メソッド
- 親クラスのメソッドをオーバーライドして拡張したいとき(
superが必要) - 共通処理をインスタンス間で共有したいとき
- 親クラスのメソッドをオーバーライドして拡張したいとき(
- アロー関数
- イベントハンドラやコールバックで
thisを固定したいとき - ただし
superは使えないので、オーバーライドには不向き
- イベントハンドラやコールバックで
✅ まとめ
superを使いたいなら 通常メソッドthisを固定したいなら アロー関数- クラス設計では「共通処理やオーバーライドは通常メソッド」「イベントハンドラやコールバックはアロー関数」と役割分担するのがベスト
