JSはオブジェクト指向であることがわかっています。オブジェクトの向きに関しては、クラスの概念を巻き込むことは避けられません。一般に、C#やJavaなどの強く型付けされた言語には、クラスを定義するための構文を固定しています。 JSの違いは、さまざまな方法を使用して独自のクラスとオブジェクトを実装できることです。いくつかの一般的な実装方法があります。
1。工場メソッド
工場の方法は、特定のオブジェクトタイプを返す工場関数を作成することを指します。
コードコピーは次のとおりです。
関数createcar(スコラー、偶像、inpg)
{
var otempcar = new Object;
otempcar.color = scolor;
otempcar.doors = idoors;
otempcar.mpg = impg;
otempcar.showcolor = function()
{
アラート(this.color);
}
OTEMPCARを返します。
}
var ocar1 = createcar( "red"、4,23);
var ocar2 = createcar( "Blue"、3,25);
ocar1.showcolor();
ocar2.showcolor();
これにより、工場関数を呼び出すたびに、新しいオブジェクトが作成されます。しかし、問題は、新しいオブジェクトが生成されるたびに、各オブジェクトが独自のバージョンのショーカラーを作成する必要があることです。実際、すべてのオブジェクトが同じ関数を共有しますオブジェクトのメソッドは工場関数の外側に定義され、次のようにオブジェクトに関数へのポインターが与えられますか
コードコピーは次のとおりです。
関数showcolor()
{
アラート(this.color);
}
関数createcar(スコラー、偶像、inpg)
{
var otempcar = new Object;
otempcar.color = scolor;
otempcar.doors = idoors;
otempcar.mpg = impg;
otempcar.showcolor = showcolor;
OTEMPCARを返します。
}
var ocar1 = createcar( "red"、4,23);
var ocar2 = createcar( "Blue"、3,25);
ocar1.showcolor();
ocar2.showcolor();
このように、各オブジェクトに独自のショーカラー関数を作成する必要はありませんが、この関数のポインターを作成するだけですが、機能はオブジェクトのメソッドとは異なります。したがって、コンストラクターメソッドが導入されます。
2。コンストラクターメソッド
コンストラクターは工場関数に非常に似ており、例のコードは次のとおりです。
コードコピーは次のとおりです。
ファンクションカー(スコラー、偶像、インプグ)
{
this.color = scolor;
this.doors = idoors;
this.mpg = IMPG;
this.showcolor = function()
{
アラート(this.color);
}
}
var ocar1 = new car( "Red"、4,23);
var ocar2 = new car( "Blue"、3,25);
コンストラクターには、内部で作成されたオブジェクトはありませんが、これが使用されるキーワードがあります。新しい演算子を使用してコンストラクターを呼び出すと、コードの最初の行を実行する前にオブジェクトが作成されます。しかし、これでどのような問題が発生しますか?この問題を解決するために、次のプロトタイプ法が導入されました。
3。プロトタイプメソッド
この方法では、オブジェクトのプロトタイププロパティを利用します。オブジェクトは、新しいオブジェクトが依存するプロトタイプと見なすことができます。ここで、空のコンストラクターを使用してクラス名を設定します。次に、すべてのメソッドと属性がプロトタイプ属性に直接割り当てられます。次のように:
コードコピーは次のとおりです。
functionCar()
{}
car.prototype.color = "red";
car.prototype.doors = 4;
car.prototype.mpg = 23;
car.prototype.drivers = new Array( "mike"、 "sue");
car.prototype.showcolor = function()
{
アラート(this.color);
}
プロトタイプメソッドは、値を直接割り当てることができ、パラメーターをコンストラクターに属性初期化の値を渡すことはできません。この方法を使用すると、2つの問題が発生します。最初の問題は、属性のデフォルト値をこのように変更する前に各オブジェクトを作成する必要があることです。各オブジェクトを作成するときに必要なプロパティ値を直接持つことはできません。これは迷惑です。 2番目の問題は、属性がオブジェクトを参照する場合です。関数共有に問題はありませんが、オブジェクト共有に問題があります。各インスタンスは通常、独自のオブジェクトを実装する必要があるためです。
次のように:
コードコピーは次のとおりです。
var ocar1 = new car();
var ocar2 = new car();
ocar1.drivers.push( "matt");
Alert(OCAR1.DRIVERS); //出力 "Mike、Sue、Matt"
alert(ocar2.drivers); // output "Mike、Sue、Matt"
したがって、ドライバーの属性はオブジェクトへのポインターにすぎないため、すべてのインスタンスが実際に同じオブジェクトを共有します。これらの問題のため、次のジョイント使用コンストラクターとプロトタイプ法を紹介します。
4。混合コンストラクター/プロトタイプメソッド
この方法の概念は、コンストラクターを使用してオブジェクトのすべての非機能特性(オブジェクトを指す通常のプロパティと属性を含む)を定義し、プロトタイプを使用してオブジェクトの関数プロパティ(メソッド)を定義することです。その結果、すべての関数は一度だけ作成され、各オブジェクトには独自のオブジェクト属性インスタンスがあります。サンプルコードは次のとおりです。
コードコピーは次のとおりです。
ファンクションカー(スコラー、偶像、インプグ)
{
this.color = scolor;
this.doors = idoors;
this.mpg = IMPG;
this.drivers = new Array( "mike"、 "sue");
}
car.prototype.showcolor = function()
{
アラート(this.color);
}
var ocar1 = new car( "Red"、4,23);
var ocar2 = new car( "Blue"、3,25);
ocar1.drivers.push( "matt");
Alert(OCAR1.DRIVERS); //出力 "Mike、Sue、Matt"
アラート(ocar2.drivers); //出力 "Mike、Sue"
サンプルコードからわかるように、この方法は、以前の方法で2つの問題を同時に解決します。ただし、このようにして、一部の開発者はまだ完璧ではないと感じています。
5。動的プロトタイプメソッド
ほとんどのオブジェクト指向言語は、プロパティとメソッドを視覚的にカプセル化することがわかります。ただし、上記の方法のshowcolorメソッドは、クラスの外側で定義されています。したがって、彼らは動的なプロトタイプアプローチを設計しました。このアプローチの基本的なアイデアは、混合コンストラクター/プロトタイプアプローチと同じです。唯一の違いは、オブジェクトメソッドの位置です。以下に示すように:
コードコピーは次のとおりです。
ファンクションカー(スコラー、偶像、インプグ)
{
this.color = scolor;
this.doors = idoors;
this.mpg = IMPG;
this.drivers = new Array( "mike"、 "sue");
if(typeof car._initialized == "未定義")
{
car.prototype.showcolor = function()
{
アラート(this.color);
}
}
car._initialized = true;
}
このように、car.prototype.showcolorは一度だけ作成されます。この依存関係により、このコードは他の言語のクラス定義に似ています。
6。混合工場法
このアプローチは通常、以前のアプローチとして使用できない回避策です。その目的は、別のオブジェクトの新しいインスタンスのみを返す偽のコンストラクターを作成することです。
コードコピーは次のとおりです。
functionCreateCar()
{
var otempcar = new Object;
otempcar.color = "red";
otempcar.doors = 4;
otempcar.mpg = 23;
otempcar.showcolor = function()
{
アラート(this.color);
};
OTEMPCARを返します。
}
var car = new car();
新しいオペレーターはCar()コンストラクター内で呼ばれるため、2番目の新しいオペレーターは自動的に無視されます。コンストラクター内で作成されたオブジェクトは、可変VARに渡されます。このアプローチには、オブジェクトメソッドの内部管理という点で、古典的なアプローチと同じ問題があります。したがって、強くお勧めします。絶対に必要でない限り、この方法を使用しないでください。