JavaScriptのプロトタイプチェイニングは継承を可能にするために設計されています。すべてのオブジェクト指向言語には継承の概念があり、継承を実装する主な目的はコードの再利用です。共通の機能やメソッドを共有することで、コードを再利用し、メモリを節約することができます。
ECMAScriptの説明によると、プロトタイプチェイニングの基本的な考え方は、ある参照型が別の参照型のプロパティやメソッドを継承するためにプロトタイプを使用することです。このプロセスを理解するための例を示します:
上記のコードでは Person と Male という 2 つの型を定義しており、それぞれプロパティとメソッドを持っています。主な違いは、Male のプロトタイプ・オブジェクトは Person のインスタンスであり、Male は Person から getName() メソッドを継承しているため、Male インスタンスは getName() メソッドで "ZhangSan" を返すことができます。これは、プロトタイプ・オブジェクトへのポインタを手動で書き換えることで実現できます。実際、JavaScript で関数を使用してメソッドが宣言されると、JavaScript の現在の実装では、デフォルトでメソッドのプロトタイプ・オブジェクトが作成され、コンストラクタ属性はデフォルトで 1 つしかなく、コンストラクタは現在宣言されている関数を指します。関数はprototype属性を通してプロトタイプオブジェクトを見つけることができます。これをコードで確認するには、次のようにします:
Person.prototype.constructor == Person // true
JavaScriptのすべての参照型はObjectを継承しており、この継承もプロトタイプチェーンを通じて行われます。すべての関数のデフォルトのプロトタイプオブジェクトはObjectのインスタンスなので、デフォルトのプロトタイプオブジェクトはObject.prototypeへの内部ポインタを含みます。オブジェクトにこれらのメソッドが組み込まれているからです。つまり、JavaScriptのすべての参照型はこれらのメソッドを継承しています。次の図は、例における完全なプロトタイプチェーンを示しています。