プロトタイプ継承(古典) — Child.prototype = Object.create(Parent.prototype)
JavaScript には「プロトタイプ継承」という仕組みがあります。
これは「あるオブジェクト(親)の機能を別のオブジェクト(子)が引き継ぐ」方法です。ES6 以降は class 構文が主流ですが、昔は Object.create を使った古典的な継承 がよく使われていました。
基本のコード例
// 親コンストラクタ
function Parent(name) {
this.name = name;
}
Parent.prototype.sayHello = function() {
console.log("こんにちは、私は " + this.name + " です");
};
// 子コンストラクタ
function Child(name, age) {
Parent.call(this, name); // 親のコンストラクタを呼び出す
this.age = age;
}
// プロトタイプ継承
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child; // constructor を修正
Child.prototype.sayAge = function() {
console.log("年齢は " + this.age + " 歳です");
};
// 使用例
const c = new Child("Aki", 20);
c.sayHello(); // → "こんにちは、私は Aki です"
c.sayAge(); // → "年齢は 20 歳です"
JavaScriptポイント解説
Parent.call(this, name)
→ 親のコンストラクタを呼び出して、thisに親のプロパティをセット。Child.prototype = Object.create(Parent.prototype)
→ 親のメソッドを子のプロトタイプにコピーして継承。Child.prototype.constructor = Child
→ プロトタイプを上書きするとconstructorがParentになるので修正。
よく使うテンプレート集
親のメソッドを拡張する
Child.prototype.sayHello = function() {
// 親のメソッドを呼ぶ
Parent.prototype.sayHello.call(this);
console.log("さらに、私は子クラスです!");
};
JavaScript複数の子インスタンス
const c1 = new Child("Mika", 18);
const c2 = new Child("Taro", 25);
c1.sayHello(); // "こんにちは、私は Mika です"
c2.sayAge(); // "年齢は 25 歳です"
JavaScript例題: 動物クラスの継承
function Animal(type) {
this.type = type;
}
Animal.prototype.move = function() {
console.log(this.type + " が動いた!");
};
function Dog(name) {
Animal.call(this, "犬");
this.name = name;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log(this.name + " がワンワン!と鳴いた");
};
const d = new Dog("ポチ");
d.move(); // "犬 が動いた!"
d.bark(); // "ポチ がワンワン!と鳴いた"
JavaScript- 効果:
DogはAnimalの機能を継承しつつ、独自のbarkを持つ。
実務でのコツ
- 古典的継承: ES6 以前のコードやライブラリでよく見かける。
- 今は class 構文推奨:
class Parent { ... } class Child extends Parent { ... }と書けるので読みやすい。 - constructor 修正を忘れない:
Object.createを使うとconstructorがずれるので注意。 - 親メソッド呼び出し:
Parent.prototype.method.call(this)で呼べる。
ありがちなハマりポイントと対策
constructorが Parent のまま:- 対策:
Child.prototype.constructor = Childを必ず書く。
- 対策:
- 親のプロパティが継承されない:
- 対策:
Parent.call(this, ...)を子コンストラクタで呼ぶ。
- 対策:
- ES6との混同:
- 古典的継承は
classのextendsと同じ役割。
- 古典的継承は
練習問題(乗り物クラス)
function Vehicle(type) {
this.type = type;
}
Vehicle.prototype.run = function() {
console.log(this.type + " が走る!");
};
function Car(name) {
Vehicle.call(this, "車");
this.name = name;
}
Car.prototype = Object.create(Vehicle.prototype);
Car.prototype.constructor = Car;
Car.prototype.horn = function() {
console.log(this.name + " がクラクションを鳴らす!");
};
const car = new Car("プリウス");
car.run(); // "車 が走る!"
car.horn(); // "プリウス がクラクションを鳴らす!"
JavaScript直感的な指針
Object.createで親のプロトタイプをコピー → 子がメソッドを継承。Parent.call(this, ...)で親のプロパティを継承。constructorを修正するのを忘れない。- ES6 の
classに繋がる基礎知識。
これを覚えれば「古いコードの継承の仕組み」を理解でき、class 構文の裏側もイメージしやすくなります。
