web-dev-qa-db-ja.com

Object .__ proto__には何が含まれていますか?

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
Alan Storm

上記の 斜視 コメントに基づいて、私はこれの底に到達することができました。私の明言されていない、間違った(そして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の下位レベルのヘルパー/コンストラクターオブジェクトのいくつかの実際のプロトタイプをマップする簡単な図をまとめました。

enter image description here

最後に-私はまたGoogle ChromeがReflectオブジェクトを実装していることを発見しました getPrototypeOfメソッドを含むObject.getPrototypeOfメソッドと同じである必要があります。

3
Alan Storm

オブジェクトグラフの上部は、仕様の他の場所で設定された期待値との一貫性を維持するために形成されています。

必然的に、「オブジェクトが不足」したために、通常のオブジェクトリンケージを使用できなくなるポイントがあります。

JavaScriptの基本的な理解により、Object[[Prototype]]は、Object関数オブジェクトの作成に使用される関数のプロトタイププロパティであると予想されます。

Functionsは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.prototypenullに設定します。

Object.__proto__.__proto__.__proto__ === null
6
52d6c6af