短い答え:オブジェクトを作成したコンストラクター__proto__
のprototype
プロパティへの参照です。
JavaScriptのオブジェクト
JavaScriptオブジェクトは、0個以上のプロパティのコレクションの組み込み型です。プロパティは、他のオブジェクト、プリミティブ値、または関数を保持するコンテナーです。
JavaScriptのコンストラクタ
関数は通常のオブジェクト([[Call]]
ECMA-262用語で実装)であり、呼び出し可能という追加機能を備えていますが、JavaScriptで別の役割を果たします。演算子を介して呼び出されると、コンストラクター(オブジェクトのファクトリー)になりますnew
。したがって、コンストラクタは他の言語のクラスに大体類似しています。
すべてのJavaScript関数は、実際にはFunction
組み込み関数オブジェクトのインスタンスであり、prototype
プロトタイプベースの継承と共有プロパティの実装に使用されるという特別なプロパティがあります。コンストラクター関数によって作成されたすべてのオブジェクトには、そのコンストラクターの値への暗黙的な参照(プロトタイプまたはと呼ばれ__proto__
ます)がありますprototype
。
コンストラクターprototype
は、コンストラクターによって作成されたすべてのオブジェクトがそのオブジェクトへの参照を継承するため、オブジェクトを構築するための一種の設計図ですprototype
。
プロトタイプチェーン
オブジェクトは、内部プロパティ[[Prototype]]
またはを介してプロトタイプを指定します__proto__
。2つのオブジェクト間のプロトタイプ関係は継承に関するものです。すべてのオブジェクトは、そのプロトタイプとして別のオブジェクトを持つことができます。プロトタイプがnull
値になる場合があります。
__proto__
プロパティによって接続されたオブジェクトのチェーンは、プロトタイプチェーンと呼ばれます。オブジェクトのプロパティへの参照が作成される場合、その参照は、その名前のプロパティを含むプロトタイプチェーンの最初のオブジェクトで検出されたプロパティへの参照です。プロトタイプチェーンは、単一のオブジェクトであるかのように動作します。
この画像を参照してください(このブログから抜粋):
オブジェクトのプロパティにアクセスしようとすると、JavaScriptはそのオブジェクトのプロパティの検索を開始し、そのプロトタイプ、プロトタイプのプロトタイプなどを使用して、プロパティが検出されるか__proto__
、値が保持されるまで続けますnull
。
プロトタイプチェーンを使用するこのタイプの継承は、クラスチェーンを使用する他の言語との混乱を避けるために、委任と呼ばれることがよくあります。
はプロトタイプチェーンの最後にあるObject
ため、ほとんどすべてのオブジェクトはのインスタンスですObject.prototype
。しかし、Object.prototype
は価値を保持しているObject
ので、インスタンスではありません。Object.prototype.__proto__
null
次のnull
ようなプロトタイプでオブジェクトを作成することもできます。
var dict = Object.create(null);
そのようなオブジェクトは、リテラルオブジェクトよりも優れたマップ(辞書)です。そのため、このパターンはdictパターン(辞書のdict)ます。
注:を使用し{}
て作成されたリテラルオブジェクトは、がへの参照であるObject
ため、のインスタンスです。({}).__proto__
Object.prototype