JavaScript を上手に学ぶには、プロトタイプ、実行、コンテキスト、クロージャといういくつかの基本概念を理解する必要があります。
プロトタイプ
JavaScript 言語では、通常、プロトタイプは OO の実装に使用されます。ここでは、JavaScript の OO 実装についてはあまり説明せず、JS のオブジェクトのメモリ モデルに焦点を当てます。開始する前に、次の点を明確にする必要があります:
1. JS には、文字列、数値、ブール値、オブジェクト、関数のデータ型があります (注: 最初の文字はすべて小文字です)。
2 「Object」、「String」、「Date」およびその他の組み込みデータ型は、実際には JS の関数名です (確認するには「alert(typeof Object)」を使用します。出力は「function」です)。通常「Date」と呼ばれるデータ型は、実際には「new Date」によって生成されたオブジェクトです。
3. JavaScript では、オブジェクトはすべて連想配列 (ハッシュ テーブル) であり、オブジェクトのプロパティを動的に指定できます。
4. Firefox の「__proto__」属性を使用して、オブジェクトの「プロトタイプ」を表示できます。
簡単な例を見てみましょう:
function Person() { this.age = 10; this.name = "test";}Person.prototype = new Object;var p = new Person;alert(p); // 出力 "[object Object]"alert(p.__proto__); // 出力 "[object Object]"
Person データ型が "プロトタイプ」を変更すると、これまでに生成されたすべての パーソン タイプのオブジェクトに影響し、今後作成される パーソン タイプのオブジェクトにも影響します。関数のプロトタイプ属性を指定すると、その関数を使用して (new 演算子を使用して) 生成されたすべてのオブジェクト インスタンスにプロトタイプが設定され、Firefox では「__proto__」属性を使用してアクセスできます。
通常、JS のオブジェクトは Object データ型を継承すると言いますが、これはどのように反映されるのでしょうか。上記のプログラムを少し変更してみましょう:
function Person() { this.age = 10; this.name = "test";}var p = new Person;alert(p); Object]"alert(p.__proto__); // 出力 "[object Object]"alert(p.__proto__.__proto__); // 出力 "[object Object]"alert(p.__proto__.__proto__ == Object.proto__) ; // "true" を出力します。alert(p.__proto__.__proto__.__proto__); // "null" を出力します。
上記のプログラムからわかるように、人の「プロトタイプ」は明確ではありません。 Person.prototype を指定しますが、デフォルト値を使用します) 「プロトタイプ」 (p.__proto__.__proto__) は正確に Object.prototype であり、Object.prototype はプロトタイプ チェーンの終端です (それ自体の祖先は null)。
JS では、オブジェクトは関数であり、関数のすべてのインスタンスもオブジェクトです。次のプログラムを見てください:
/* オブジェクトと関数は両方とも関数データ型です*/alert(typeof Object); // 出力 "関数"alert(typeof Function); // 出力 "関数"/ * Function プロトタイプは空の関数です */alert(Function.prototype); // 出力 "function() {}"alert(Function.__proto__ == Function.prototype); // 出力 "true"/* 関数はオブジェクトですプロトタイプ チェーンの終点は Object.prototype */alert(Function.__proto__.__proto__ == Object.prototype); //output "true"/* オブジェクトは function のインスタンスです*/alert(Object.__proto__) == Function.prototype) ; // 出力 "true" アラート(Object.__proto__.__proto__ == Object.prototype); // 出力 "true" Function.prototype を変更すると "Object" に影響し、Object.prototype を変更すると影響を受けます関数のすべてのインスタンス。