継承とプロトタイプ | プロトタイプチェーンの理解 | JavaScript 超完全入門 基本から発展までのすべて

現在作成中です。今後加筆修正してまいります。
スポンサーリンク
スポンサーリンク

継承とプロトタイプとは?

JavaScriptにおける継承とは、あるオブジェクトが他のオブジェクトのプロパティやメソッドを利用できる仕組みです。これにより、コードの再利用が促進され、オブジェクト指向プログラミングの基本である「継承」を実現します。JavaScriptでは、オブジェクト指向の継承がプロトタイプチェーンと呼ばれる仕組みを通じて行われます。

プロトタイプチェーンは、オブジェクトが別のオブジェクト(プロトタイプ)からメソッドやプロパティを継承する仕組みです。JavaScriptでは、全てのオブジェクトがプロトタイプオブジェクトを持ち、それを通じて継承が行われます。

プロトタイプチェーンの基本構造

JavaScriptでは、オブジェクトは他のオブジェクトからメソッドやプロパティを継承します。これがプロトタイプチェーンと呼ばれ、各オブジェクトが他のオブジェクトを参照してチェーンが形成されます。オブジェクトは、自身のプロパティやメソッドが見つからない場合、プロトタイプチェーンを辿って上位のオブジェクトからそれを探します。

プロトタイプチェーンの例

function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  return this.name + ' makes a sound.';
}

let dog = new Animal('Dog');
console.log(dog.speak()); // 出力: Dog makes a sound.

この例では、Animalコンストラクタ関数を使ってdogオブジェクトを作成しています。Animalのプロトタイプに定義されたspeakメソッドが、dogオブジェクトから利用されています。これは、dogオブジェクトがAnimal.prototypeを継承しているためです。

プロトタイプチェーンの仕組み

プロトタイプチェーンは次のような流れで機能します。

  1. オブジェクトのプロパティを検索: オブジェクト内にプロパティやメソッドが存在するか確認します。
  2. プロトタイプを参照: 該当するプロパティが見つからない場合、オブジェクトの__proto__(プロトタイプ)を参照します。
  3. チェーンの終端まで検索: プロトタイプチェーンを辿って上位のプロトタイプを順次検索し、最終的にnullに達するまで続きます。

表: プロトタイプチェーンの流れ

ステップ 説明
オブジェクトのプロパティを探す 最初に、オブジェクト自体にプロパティやメソッドがあるかを確認します。
プロトタイプを参照する 該当するプロパティがなければ、そのオブジェクトのプロトタイプに遡って探します。
最上位プロトタイプまで探索 プロトタイプチェーンの終端に到達するまで、上位のプロトタイプを順次辿ります。

プロトタイプ継承のメリット

プロトタイプを使った継承には以下のメリットがあります。

  • コードの再利用: 一度定義したメソッドやプロパティを、複数のオブジェクト間で共有できるため、コードの重複を避けられます。
  • メモリ効率の向上: 各オブジェクトが独自にメソッドを保持する必要がなく、プロトタイプに定義されたメソッドを参照するため、メモリ効率が良くなります。
  • 柔軟なオブジェクト構造: JavaScriptの動的な性質を活かし、必要に応じてプロトタイプチェーンを動的に変更することができます。

プロトタイプチェーンの応用例

次に、プロトタイプチェーンを活用した応用例を紹介します。以下の例では、Animalクラスを継承するDogクラスを作成し、プロトタイプチェーンを利用してメソッドを継承します。

応用例: プロトタイプ継承によるクラスの拡張

function Dog(name, breed) {
  Animal.call(this, name); // Animalコンストラクタを呼び出す
  this.breed = breed;
}

// DogのプロトタイプをAnimalのプロトタイプに設定
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.speak = function() {
  return this.name + ' the ' + this.breed + ' barks.';
}

let myDog = new Dog('Buddy', 'Golden Retriever');
console.log(myDog.speak()); // 出力: Buddy the Golden Retriever barks.

この例では、DogクラスがAnimalクラスを継承しており、DogのプロトタイプにAnimalのプロトタイプを設定することで、継承を実現しています。myDogオブジェクトはAnimalのメソッドにアクセスできます。

まとめ

JavaScriptのプロトタイプチェーンは、オブジェクト指向プログラミングの基本である「継承」を実現するための重要な概念です。プロトタイプチェーンを理解することで、コードの再利用や効率的なオブジェクト管理が可能になります。継承の仕組みを活用し、柔軟かつ効率的なプログラムを作成するために、このプロトタイプの仕組みをしっかりと理解しておくことが重要です。