コードを実行すると:
console.log(Function.prototype);
戻り値:
function Empty() {}
(少なくともChromeでは)
これはなぜですか?プロトタイプはほとんどの場合、まっすぐなオブジェクト リテラルであるという印象を受けました。これは、私がチェックした他のほとんどすべての場所に当てはまるようです。Function.prototype が別のものに解決される理由が気になります。
コードを実行すると:
console.log(Function.prototype);
戻り値:
function Empty() {}
(少なくともChromeでは)
これはなぜですか?プロトタイプはほとんどの場合、まっすぐなオブジェクト リテラルであるという印象を受けました。これは、私がチェックした他のほとんどすべての場所に当てはまるようです。Function.prototype が別のものに解決される理由が気になります。
それは ECMAScript 5 が要求するものだからです。
15.3.4関数プロトタイプオブジェクトのプロパティ
プロトタイプ オブジェクトは、
Function
それ自体が Function オブジェクト ([[Class]]
「関数」) であり、呼び出されると、任意の引数を受け入れて を返しますundefined
。
他のほとんど(またはすべて?)のネイティブ コンストラクターには、生成されるオブジェクトと同じ型として定義されたプロトタイプがあります。
プロトタイプ オブジェクトがその型のメソッドを保持していることを考えると、それらのメソッドがそのオブジェクトで呼び出されたときに適切に機能する必要があることは理にかなっています。
最初に、オブジェクトが動作を継承するもののように、オブジェクトの実際のプロトタイプがその __proto__ プロパティに格納されていることに注意してください(ほとんどの実装では- thx @the system)。Function オブジェクトの "prototype" プロパティは、独自の __proto__ です。これは、特別な組み込み関数リテラル シングルトン オブジェクトですfunction(){}
(Chrome の console.log() はfunction Empty() {}
何らかの理由で出力する必要がありますが、同じことです)。すべての関数がオブジェクトであるため (ただし、すべてのオブジェクトが関数であるとは限りません)、このオブジェクトの __proto__ は別の特別な組み込みリテラル シングルトン オブジェクト[object Object]
です。[object Object]
__proto__ はヌルです。[object Object]
プロトタイプチェーンのルートです。
この出力を調べると、物事がどのように配置されているかがわかります (コマンド ライン インタープリターから実行可能)。
print( Function.prototype === Function.__proto__ );
var f = new Funtion();
print( f.__proto__ === Function.prototype );
print( f.__proto__ );
print( f.__proto__.__proto__ );
print( f.__proto__.__proto__.proto__ );
現在、組み込みの JavaScript オブジェクトには「クラス」と呼ばれるプロパティがあります。このプロパティは不変で、JavaScript エンジン自体によって設定されます。このクラスは、特別な内部目的のために JavaScript によって使用されます。Javascriptはこれを知る必要があるため、たとえば関数オブジェクトを呼び出すことができることを認識しています(@thesystemによって提供された以前の回答からのリンクに示されているように- http://es5.github.com/#x15.3.4 )。仕様から:
"[[Class]] 内部プロパティの値は、組み込みオブジェクトのすべての種類について、この仕様によって定義されています。ホスト オブジェクトの [[Class]] 内部プロパティの値は、いずれかを除く任意の文字列値である可能性があります" Arguments"、"Array"、"Boolean"、"Date"、"Error"、"Function"、"JSON"、"Math"、"Number"、"Object"、"RegExp"、および "String"。値[[Class]] 内部プロパティの . - http://es5.github.com/#x8.6.2
Function オブジェクトのプロトタイプ AKA の「クラス」function(){}
は「Function」です。Function のクラスも「Function」です。新しいオブジェクトが作成されると、Javascript はそのコンストラクターのクラス プロパティに基づいてそのクラス プロパティを直接設定します。これはオブジェクトの存続期間中不変です。