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