JavaScriptファクトリーの方法の原始的な方法
オブジェクトのプロパティはオブジェクトの作成後に動的に定義できるため、JavaScript が最初に導入されたときは次のようなコードが作成されました。
次のようにコードをコピーします。
var oCar = 新しいオブジェクト;
oCar.color = "青";
oCar.doors = 4;
oCar.mpg = 25;
oCar.showColor = function() {
アラート(この色);
};
上記のコードでは、オブジェクトの car が作成されます。次に、それにいくつかの属性を与えます。青色で、ドアが 4 つあり、走行距離は 1 ガロンあたり 25 マイルです。最後の属性は実際には関数へのポインターであり、属性がメソッドであることを意味します。このコードを実行すると、対象の車が使用できるようになります。しかし、ここには問題があります。つまり、car の複数のインスタンスを作成する必要がある可能性があり、これは明らかに良い方法ではありません。
解決策: ファクトリーメソッド
この問題を解決するために、開発者は、特定のタイプのオブジェクトを作成して返すファクトリ関数を作成しました。たとえば、関数 createCar() を使用すると、前にリストした車オブジェクトの作成操作をカプセル化できます。
次のようにコードをコピーします。
function createCar(sColor,iDoors,iMpg) {
var oTempCar = 新しいオブジェクト;
oTempCar.color = sColor;
oTempCar.doors = iドア;
oTempCar.mpg = iMpg;
oTempCar.showColor = function() {
アラート(この色);
};
oTempCar を返します。
}
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("青",3,25);
oCar1.showColor(); //「赤」を出力します。
oCar2.showColor(); //「青」を出力します。
このファクトリ関数を呼び出すと、新しいオブジェクトが作成され、それに必要な属性がすべて与えられ、createCar() 関数にパラメータが追加され、作成される車オブジェクトの色、ドア、mpg 属性に値が割り当てられます。これにより、2 つのオブジェクトが同じプロパティを持つことになりますが、プロパティ値は異なります。このメソッドの欠点は、車のオブジェクトが作成されるたびに (つまり、createCar 関数が 1 回呼び出される)、オブジェクトごとに showColor メソッドが繰り返し作成されることです。実際、これは各オブジェクトで同じものを共有する必要はありません。関数。 。そこで、メソッド属性を関数の外で宣言しようとします。
ファクトリ関数の外でオブジェクト メソッドを定義する
一部の開発者は、ファクトリ関数の外側でオブジェクトのメソッドを定義し、プロパティを通じてそのメソッドを指定することで、この問題を回避しています。
次のようにコードをコピーします。
関数 showColor() {
アラート(この色);
}
function createCar(sColor,iDoors,iMpg) {
var oTempCar = 新しいオブジェクト;
oTempCar.color = sColor;
oTempCar.doors = iドア;
oTempCar.mpg = iMpg;
oTempCar.showColor = showColor;
oTempCar を返します。
}
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("青",3,25);
oCar1.showColor(); //「赤」を出力します。
oCar2.showColor(); //「青」を出力します。
上記の書き換えられたコードでは、関数 showColor() が関数 createCar() の前に定義されています。 createCar() 内で、オブジェクトには既存の showColor() 関数へのポインタが与えられます。機能的には、これにより関数オブジェクトを繰り返し作成する問題は解決されますが、意味的には関数はオブジェクトのメソッドのようには見えません。