Function.prototype
ECMAScript 言語仕様から:
15.3.3.1 関数.プロトタイプ
Function.prototype の初期値は Function プロトタイプ オブジェクトです (セクション 15.3.4)。
15.3.4 関数プロトタイプオブジェクトのプロパティ
Function プロトタイプ オブジェクトは、それ自体が Function オブジェクト (その [[Class]] は "Function") であり、呼び出されると、任意の引数を受け入れ、undefined を返します。関数プロトタイプ オブジェクトの内部 [[Prototype]] プロパティの値は、オブジェクト プロトタイプ オブジェクト (セクション 15.3.2.1) です。
これは「空の本体」を持つ関数です。呼び出された場合、未定義を返すだけです。Function プロトタイプ オブジェクトには、独自の valueOf プロパティがありません。ただし、オブジェクト プロトタイプ オブジェクトから valueOf プロパティを継承します。
私はこの出力を得る:
- Opera:関数 () { [ネイティブ コード] }
- Chrome:関数 Empty() {}
- IE7:関数プロトタイプ() { [ネイティブ コード]}
- FF3:関数 () { }
Chrome と IE7 は関数に名前を付けましたが、Opera と IE7 は実装を明らかにしないと言っています。彼らは皆、これに同意します:
nl(typeof Function.prototype); //function
これを次と比較してください。
nl(typeof Object.prototype); //object
nl(typeof Array.prototype); //object
nl(typeof String.prototype); // object
関数.プロトタイプ.プロトタイプ
Opera と IE7 からundefinedを取得し、Chrome からnullを取得し、FF3 から[object Object]を取得します。誰が正しいですか?「関数プロトタイプオブジェクト自体が関数オブジェクトである」ため、それ自体への循環参照であってはなりませんか? 循環参照を回避するために、彼らはさまざまな方法を選択しました。その基準があるのか、実装次第なのかはわかりませんが、オブジェクトが正しいと思います。ところで、ここでは、以前の質問で尋ねたように、内部の [[prototype]] と実際の公開プロトタイプの違いを確認できます。
Function.prototype.prototype == オブジェクト.prototype
同じオブジェクトではないため、これは false です。上記を参照。
関数.プロトタイプ.プロトタイプ.プロトタイプ
Function.prototype.prototype の実装がオブジェクトを返すため、FF のみが答えを提供します。
提案された出力がより論理的に見えることに同意します。
彼らはこれに同意します:
nl(Object.prototype); // [object Object]
nl(Object.prototype.prototype); // undefined