10

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__関数とは何ですか?

4

2 に答える 2

9

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

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

JavaScript の基本的な理解から、関数オブジェクトを作成するために使用される関数のプロトタイプ プロパティであることが[[Prototype]]予想されます。ObjectObject

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
于 2016-12-01T21:56:36.717 に答える
4

上記の squint のコメントに基づいて、私はこの問題の根底にたどり着くことができました。Objectグローバルヘルパー オブジェクトのプロトタイプ オブジェクトは、javascript のプロトタイプ チェーンの先頭/末尾にあるトップ レベルの「プロトタイプのプロトタイプ」でもあるという、私の明言されていない誤った (そして 10 年以上の) 仮定。本当じゃない。

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オブジェクトを実装していることも発見しました。メソッドと同じように見えます。getPrototypeOfObject.getPrototypeOf

于 2016-12-02T17:26:12.157 に答える