オブジェクト グラフの上部は、仕様の他の場所で設定された期待値との一貫性をできるだけ維持するように形成されます。
必然的に、「オブジェクトが不足する」ため、通常のオブジェクト リンケージが使用できなくなるポイントが発生します。
JavaScript の基本的な理解から、関数オブジェクトを作成するために使用される関数のプロトタイプ プロパティであることが[[Prototype]]
予想されます。Object
Object
Function
関数オブジェクトを使用して s が作成されることが期待されるFunction
ため、...
Object.__proto__ === Function.prototype
オブジェクト グラフの最上位にいて、期待される動作の一貫性を維持したいので、[[Prototype]]
のを に設定Function
しますFunction.prototype
。
Function.__proto__ === Function.prototype
したがって、保証しFunction instanceof Function === true
ます。
Function.prototype
次の理由により、それが特別な関数オブジェクトであることを示すことができます。
Function.prototype.prototype === undefined
...そしてすべてのユーザー定義関数 (fat-arrows を除く) は、そのプロトタイプ プロパティにオブジェクトを持っています。
上記のすべてのため:
Object.__proto__ === Function.__proto__
これは奇妙に見えるかもしれませんが、前述のように、オブジェクト グラフの上部には、ポイントする候補オブジェクトの限定されたセットがあります。
TC-39 は、現在、 の が何であるかを特定する必要が[[Prototype]]
あり[[Prototype]]
ましObject
た。上記から、[[Prototype]]
ofObject
がであることがわかりFunction.prototype
ます。
ある意味ではFunction.prototype
、オブジェクト グラフの上にあるので、特別なObject
インスタンス (「プロトタイプ オブジェクト」) がこの値として選択されました。
これは、すべてのプロトタイプ チェーンの先頭を で簡単に結び付けることができることを意味しObject.prototype
ます。
もちろん、これはすべてが「オブジェクトである」という望ましい要件も満たしています。
Object.__proto__.__proto__ === Object.prototype
この時点で、オブジェクト グラフを完成させる必要があるため、 を に設定[[Prototype]]
しObject.prototype
ますnull
。
Object.__proto__.__proto__.__proto__ === null