JSのプロトタイプチェーンとは?

JSにおけるプロトタイプチェーンとは?

JavaScriptにおいて、オブジェクト指向プログラミングを実現するための重要な仕組みの一つに「プロトタイプチェーン」があります。プロトタイプチェーンを理解することは、JavaScriptのオブジェクト指向の概念を深く理解する上で非常に重要です。この記事では、プロトタイプとは何か、プロトタイプチェーンの基本概念、そしてその利点について詳しく説明します。

プロトタイプとは

JavaScriptにおけるプロトタイプとは、オブジェクトが他のオブジェクトのプロパティやメソッドを継承するための仕組みです。JavaScriptでは、すべてのオブジェクトは、自身のプロパティとメソッドに加えて、プロトタイプと呼ばれる別のオブジェクトへの参照を持っています。プロトタイプは、オブジェクトが共有するプロパティやメソッドを定義するために使用されます。

プロトタイプの基本概念を理解するために、以下のコード例を見てみましょう。


const animal = {
  type: '動物',
  breathe: function() {
    console.log('呼吸しています');
  }
};

const dog = Object.create(animal);
dog.name = 'ポチ';

console.log(dog.type); // 出力: 動物
dog.breathe(); // 出力: 呼吸しています

上記の例では、animalオブジェクトをプロトタイプとして、dogオブジェクトを作成しています。dogオブジェクトは、自身には name プロパティのみを持ちますが、プロトタイプである animal オブジェクトのプロパティ(type)やメソッド(breathe())にもアクセスすることができます。

プロトタイプチェーン

プロトタイプチェーンは、JavaScriptエンジンがオブジェクトのプロパティやメソッドを検索するためのメカニズムです。具体的には、以下の手順でプロパティやメソッドが検索されます。

  1. オブジェクト自身のプロパティやメソッドを検索する
    JavaScriptエンジンは、まずオブジェクト自身の中に該当するプロパティやメソッドが存在するかどうかを検索します。
  2. プロトタイプを検索する
    オブジェクト自身に該当するプロパティやメソッドが存在しない場合、次にそのオブジェクトのプロトタイプを参照します。
  3. さらにプロトタイプを辿る
    プロトタイプにも該当するプロパティやメソッドが存在しない場合、さらにそのプロトタイプのプロトタイプへと辿っていきます。最終的には、プロトタイプチェーンの末尾にある null まで検索が続きます。

このように、オブジェクト自身のプロパティ/メソッド → プロトタイプのプロパティ/メソッド → プロトタイプのプロトタイプ…と、参照が鎖のようにつながっている構造をプロトタイプチェーンと呼びます。

以下の図は、dogオブジェクトのプロトタイプチェーンを示しています:


dog --> animal --> Object.prototype --> null

dogオブジェクトは、animalオブジェクトをプロトタイプとして持ち、animalオブジェクトは Object.prototype をプロトタイプとして持ちます。最終的に、Object.prototypeのプロトタイプは null であり、ここでチェーンは終了します。

プロトタイプチェーンの利点

プロトタイプチェーンを利用することで、以下の利点があります:

利点 説明
コードの再利用性 共通のプロパティやメソッドをプロトタイプで定義することで、複数のオブジェクトで共有することができます。これにより、重複するコードの記述を避けることができます。
メモリ効率の向上 各オブジェクトが全てのプロパティやメソッドを持つ必要がなくなり、メモリ使用量を削減できます。プロトタイプチェーンを利用することで、同じプロパティやメソッドを複数のオブジェクトで共有することができます。

まとめ

JavaScriptにおけるプロトタイプチェーンは、オブジェクト指向プログラミングを実現するための重要な仕組みです。プロトタイプチェーンを理解することで、オブジェクトの継承やプロパティ/メソッドの検索について深く理解することができます。プロトタイプチェーンの概念を把握し、実際のコードでどのように活用するかを考えることで、より効率的で再利用可能なコードを書くことができるようになります。

参考文献

QA

Q1: 全てのオブジェクトのプロトタイプは `Object` オブジェクトですか?
A1: いいえ、Object.create(null) を用いて作成されたオブジェクトを除き、全てのオブジェクトのプロトタイプチェーンは最終的に Object オブジェクトに到達します。Object.create(null) で作成されたオブジェクトは、プロトタイプチェーンの末尾が null であるため、Object オブジェクトには到達しません。

Q2: プロトタイプチェーンはどのように検索されますか?
A2: オブジェクトのプロパティやメソッドにアクセスする際、JavaScriptエンジンはまずそのオブジェクト自身を検索し、次にそのプロトタイプ、さらにそのプロトタイプのプロトタイプと、null に到達するまで辿っていきます。もし null に到達するまで該当するプロパティやメソッドが見つからなかった場合、そのプロパティやメソッドは存在しないと見なされます。

Q3: プロトタイプチェーンの利点は何ですか?
A3: プロトタイプチェーンを利用することで、コードの再利用性を高めることができ、共通のプロパティやメソッドを複数のオブジェクトで共有することができます。また、メモリ効率が向上し、各オブジェクトが全てのプロパティやメソッドを持つ必要がなくなるため、メモリ使用量を削減することができます。

その他の参考記事:JavaScript テスト プロトタイプ