以前、私は Javascript のプロトタイプ チェーンにおけるプロトタイプの継承と識別子の検索について少し混乱していました。
たとえば、次のコード:
function Foo() {};
var foo = new Foo();
Foo.prototype.label = "ラルエンス";
アラート(foo.label); //出力: ラルエンス
alert(Foo.label);//出力: 未定義
今日、次の写真を見ました:
JavaScript オブジェクトのレイアウト
また、JavaScript オブジェクト階層:
も参照してください。
プロトタイプは、その関数によって作成されたオブジェクト/インスタンスによって継承されるプロパティにのみ使用されます。関数自体は、関連付けられたプロトタイプを使用しません。
言い換えると、関数オブジェクトのプロトタイプは、プロトタイプチェーンの検索プロセスに影響を与えません。
今日、Firefox で発見しました (Firefox が __proto__ を通じて [[prototype]] を公開したため)、実際に識別子検索に参加しているのは関数オブジェクトの __proto__ です
function Foo() {};
var foo = new Foo();
Foo.__proto__.label = "ラルエンス";
alert(Foo.label); //出力: ラルエンス
alert(foo.label);//出力: 未定義
そして明らかに:
function Foo() {};
alert(Foo.__proto__ === Foo.prototype) //出力: false
さらに、次のようにも説明されています
alert(Object.forEach); // 未定義
Function.prototype.forEach = function(オブジェクト、ブロック、コンテキスト) {
for (オブジェクト内の var キー) {
If (typeof this.prototype[key] == "未定義") {
block.call(context, object[key], key, object);
}
}
};
alert(Object.forEach);
alert(Function.forEach);
alert(Object.forEach === Function.forEach) // true
;