この記事は、前回の記事 JavaScript オブジェクト指向プログラミング (1) 基礎 の続きです。
前の記事で述べたように、JavaScript にはクラスの概念がなく、クラス定義を実装するには関数を使用する必要があります。まず例で説明します。
function myClass ()
{
var id = 1;
var name = "johnson";
this.ID = id;
this.Name = name; >//method
this.showMessage = function()
{
alert("ID: " this.ID ", Name: " this.Name);
}
}
var obj1 = new myClass();
var obj2 = new myClass();
関数の定義は実際にはクラスのコンストラクターと同等であり、最後の 2 つの文は次のようになります。このクラスのインスタンスを作成します。まず最初の文を分析しましょう: var obj1 = new myClass(); new を使用してクラスのインスタンスを作成する場合、インタープリターは最初に空のオブジェクトを作成します。次に、この myClass 関数を実行し、このポインターがこのクラスのインスタンスを指すようにします。 this.ID = id; と this.Name = name; および this.showMessage = function(){...} が発生すると、これら 2 つのプロパティと this メソッドが作成され、変数 id と name は次のようになります。値レベルの関数は、これら 2 つのプロパティとこの関数オブジェクト (shwoMessage) に割り当てられます。このプロセスは、C# のコンストラクターと同様に、オブジェクトの初期化に相当します。最後に new はこのオブジェクトを返します。 2 番目の文を見てください: var obj2 = new myClass(); 実行プロセスは前の文と同じです。つまり、空のオブジェクトを作成し、myClass 関数を実行して 2 つのプロパティと 1 つのメソッドを定義します。
上記の分析からわかるように、クラスを実装する上記の方法は、関数の定義でクラスの属性メソッドを定義することです。デメリットもあります。上に示したように、このクラスのインスタンスを 2 つ以上作成する必要がある場合、これらのプロパティは複数回作成されます。
では、この状況を回避するにはどうすればよいでしょうか?プロトタイプの使用については、前の記事でも触れました。プロトタイプは、その名前のようにプロトタイプです。各関数には、実際にはこの関数オブジェクトのメンバーのコレクションを表すサブオブジェクト プロトタイプがあります。ここでは、プロトタイプは実際にはクラスであると言えます。メンバーの。プロトタイプによって定義されたプロパティとメソッドは、関数のコンストラクターが実行される前に実行されるため、オブジェクトが新規になる前に、プロトタイプのメンバーが実際に実行されます。まず例を見てみましょう:
関数myClass()
{
//Constructor
}
myClass.prototype =
{
ID: 1,
名前: "johnson",
showMessage: function ()
{
alert("ID: " this.ID ", 名前: " this.Name)
}
}
var obj1 = new myClass(); var obj2 = new myClass ();
クラスの構造は前の例と同じですが、ここではプロトタイプを使用して実装されています。まず最後の 2 つの文を見てみましょう。前述したように、プロトタイプは関数コンストラクターの前、つまり var obj1 = new myClass(); が実行される前に、このクラスにはすでに ID、Name 属性、および showMessage メソッドが含まれています。エグゼキュータが文を記述するときの実行プロセスは次のとおりです。前の例との比較に注意してください。まず、空のオブジェクトを作成し、this ポインタをこのオブジェクトにポイントします。次に、関数のプロトタイプ オブジェクトのすべてのメンバーをこのオブジェクトに割り当てます (これらのメンバーは再度作成されないことに注意してください)。次に関数本体を実行します。最後に new はこのオブジェクトを返します。次の文を実行するとき: この処理も実行され、これらのメンバーが繰り返し作成されることはありません。
上記のコードは単なる例です。実際のプロジェクトでは、クラス内に多数のメンバーが存在し、多数のインスタンスを作成する必要がある場合があります。このプロトタイプがその優位性を示すでしょう。さらに、上記のコードでは、コードがより明確に見えるように、中括弧構文を使用してプロトタイプのメンバーを定義しています。これは推奨されるクラス設計パターンです。もちろん、多くのプロジェクトでは、より最適化された JavaScript プログラミング モデルが見つかる可能性があり、今後も新しいモデルが導入されることを期待しています。また、時間の経過とともに、すべての主流ブラウザが JavaScript 解析を標準化することも期待しています。 。
上記のように、プロトタイプで定義されたメンバーはコンストラクターの前に発生します。この例では、実行が When に到達したときにコンストラクターが空であることがわかります。 var obj1 = new myClass(); とすると、正しい属性値を示すポップアップ ダイアログ ボックスが表示されます。
この記事を書いてからたくさんのお兄さんたちからコメントをいただき、とても得るものがありました。上記の例についてさらに詳しく説明すると、次のコード: