ここでは、「クラス継承(class 構文)」と「プロトタイプ継承(prototype 直接操作)」の内部の違いを、初心者向けに「動作の中身」が見えるようにステップで比較していきます。
まずは全体イメージ
| 比較項目 | クラス継承(class) | プロトタイプ継承(prototype) |
|---|---|---|
| 構文の見た目 | JavaやPythonに似たスタイル | ちょっと低レベルで昔のJS方式 |
| 実態 | 実は内部的には prototype を使っている | prototype を直接操作して作る |
| 学びやすさ | わかりやすい・直感的 | 難しいけど仕組みが見える |
| 推奨度 | ✅ 現代JSの主流 | ⚙️ 内部を理解したいときに学ぶ |
ステップ1:クラス継承の例
// 親クラス
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} が鳴きます。`);
}
}
// 子クラス
class Dog extends Animal {
speak() {
console.log(`${this.name} がワン!と鳴きます。`);
}
}
const dog = new Dog("ポチ");
dog.speak(); // → ポチ がワン!と鳴きます。
JavaScript📘 ポイント
extendsは自動的に「親クラスの prototype を継承」します。super()で親のコンストラクタを呼び出します。- 内部的には、
Dog.prototype.__proto__ === Animal.prototypeが成り立っています。
ステップ2:同じことを prototype で書くと…
// 親「コンストラクタ関数」
function Animal(name) {
this.name = name;
}
// メソッドを prototype に定義
Animal.prototype.speak = function() {
console.log(`${this.name} が鳴きます。`);
};
// 子「コンストラクタ関数」
function Dog(name) {
// 親コンストラクタを呼ぶ
Animal.call(this, name);
}
// 継承の仕組みを手動で設定
Dog.prototype = Object.create(Animal.prototype);
// コンストラクタ参照を修正
Dog.prototype.constructor = Dog;
// 子メソッドを追加
Dog.prototype.speak = function() {
console.log(`${this.name} がワン!と鳴きます。`);
};
const dog = new Dog("ポチ");
dog.speak(); // → ポチ がワン!と鳴きます。
JavaScript📘 ポイント
Object.create(Animal.prototype)で「親の prototype」をコピーしている。Dog.prototype.constructor = Dogを設定しないと参照が狂う。- 実際の「class」構文は、これを裏で自動でやってくれている!
ステップ3:内部のつながりを可視化
console.log(Dog.prototype.__proto__ === Animal.prototype); // true
console.log(dog.__proto__ === Dog.prototype); // true
console.log(dog instanceof Animal); // true
JavaScript🔗 継承チェーン図(実際の内部構造)
dog
└──> Dog.prototype
└──> Animal.prototype
└──> Object.prototype
└──> null
➡ つまり「クラス継承」も「プロトタイプ継承」も、最終的には 同じチェーン構造 になります。class はただそれを「きれいな構文」で包んでいるだけです。
ステップ4:動作の比較まとめ
| 観点 | class継承 | prototype継承 |
|---|---|---|
| メソッド定義 | class 内でメソッドを書く | Function.prototype に追加する |
| 継承設定 | extends キーワード | Object.create() 手動設定 |
| super呼び出し | super() で簡単 | Parent.call(this) 必要 |
| 可読性 | 高い(直感的) | 低い(仕組み重視) |
| 実行速度 | 同等(中身は同じ) | 同等 |
| 主な用途 | 現代のJS開発(推奨) | 低レベル理解・古いコード解析 |
練習課題(初心者向け)
1️⃣ 次の Cat クラスを作って、Animal を継承してみよう
2️⃣ Cat に speak() メソッドを追加して "ニャー!" と出力
3️⃣ class 版と prototype 版、どちらも書いてみて比較!
まとめ
| 要点 | 説明 |
|---|---|
| JSのクラスは「糖衣構文」 | 内部的には prototype ベースで動いている |
| プロトタイプチェーン | メソッド探索の仕組み(親をたどる) |
| class構文 | 人間が書きやすいように作られた表現方法 |
| prototype理解 | クラス継承の裏側を理解するカギ |
