Google ChromのJavaScriptでは、オブジェクトには、プロトタイプ(または親)オブジェクトを指す__proto__
という名前のプロパティがあります。
var foo = {};
console.log(foo.__proto__ === Object.prototype); //returns true
ただし、これはObject
オブジェクトの場合は正しくないです。
console.log(Object.__proto__ === Object.prototype); //returns false
Object.__proto__
プロパティは空のメソッドのようです
> console.log(Object.__proto__.toString());
function () {}
標準化団体の外部で開始されるJavaScript機能に依存することについての警告ストーリーとして機能する以外に、Object.__proto__
関数とは何ですか?
上記の 斜視 コメントに基づいて、私はこれの底に到達することができました。私の明言されていない、間違った(そして10年以上の)仮定は、グローバルObject
ヘルパーオブジェクトのプロトタイプオブジェクトが、JavaScriptのプロトタイプチェーンのトップ/エンドのトップレベルの「プロトタイプのプロトタイプ」でもあるというものでした。本当じゃない。
Object
ヘルパーオブジェクトとFunction
ヘルパーオブジェクトはどちらも同じ親プロトタイプオブジェクトを持っています
console.log( Object.__proto__ === Function.__proto__ ); //true
したがって、Object.__proto__
が空の関数を指す理由は、空の関数がObject
のプロトタイプオブジェクトであるためです。オブジェクト。 Object
から(.prototype
を使用せずに)プロトタイプのプロトタイプにアクセスしたい場合は、もう少し掘り下げる必要があります。
console.log( Object.__proto__.__proto__ === Object.prototype ); //true
また、Javascriptの下位レベルのヘルパー/コンストラクターオブジェクトのいくつかの実際のプロトタイプをマップする簡単な図をまとめました。
最後に-私はまたGoogle ChromeがReflect
オブジェクトを実装していることを発見しました getPrototypeOf
メソッドを含むObject.getPrototypeOf
メソッドと同じである必要があります。
オブジェクトグラフの上部は、仕様の他の場所で設定された期待値との一貫性を維持するために形成されています。
必然的に、「オブジェクトが不足」したために、通常のオブジェクトリンケージを使用できなくなるポイントがあります。
JavaScriptの基本的な理解により、Object
の[[Prototype]]
は、Object
関数オブジェクトの作成に使用される関数のプロトタイププロパティであると予想されます。
Function
sはFunction
関数オブジェクトを使用して作成されると予想されるため、...
Object.__proto__ === Function.prototype
オブジェクトグラフの一番上にいて、期待される動作の一貫性を維持したいので、Function
の[[Prototype]]
をFunction.prototype
に構成します。
Function.__proto__ === Function.prototype
したがって、Function instanceof Function === true
を確保します。
Function.prototype
が特別な関数オブジェクトであることを示すことができます。理由は次のとおりです。
Function.prototype.prototype === undefined
...そしてすべてのユーザー定義関数(fat-arrowsを除く)には、そのプロトタイププロパティにオブジェクトがあります。
上記のすべてのために:
Object.__proto__ === Function.__proto__
これは奇妙に見えるかもしれませんが、前述のように、オブジェクトグラフの上部には、ポイントする候補オブジェクトのセットが限られています。
TC-39は、Object
の[[Prototype]]
の[[Prototype]]
が何であるかを識別する必要がありました。上記により、Object
の[[Prototype]]
はFunction.prototype
であることがわかります。
ある意味で、オブジェクトグラフでFunction.prototype
の上にあるため、この値として特別なObject
インスタンス(「プロトタイプオブジェクト」)が選択されました。
これは、すべてのプロトタイプチェーンの最上位をObject.prototype
と便利に結び付けることができることを意味します。
もちろん、これはすべてが「オブジェクト」であるという望ましい要件も満たしています。
Object.__proto__.__proto__ === Object.prototype
この時点でオブジェクトグラフを完成させる必要があるため、[[Prototype]]
のObject.prototype
をnull
に設定します。
Object.__proto__.__proto__.__proto__ === null