JavaScript でクラスまたはオブジェクトを定義するには、いくつかの一般的な方法があります。 ファクトリーアプローチ
function createCar(色, ドア, mpg){
var tempCar =新しいオブジェクト;
tempCar.color = 色;
tempCar.doors = ドア;
tempCar.mpg = mpg;
tempCar.showColor = function (){
アラート(この.color);
};
tempCarを返します。
}
var car1 = createCar("赤", 4, 23);
var car2 = createCar("青", 3, 25);
car1.showColor();
car2.showColor();
特定の型のオブジェクトを作成して返すことができるファクトリ関数を定義しました。これは良いように見えますが、呼び出されるたびに新しい関数 showColor を作成する必要があります。 関数 showColor(){ アラート(この色); } ファクトリ関数内で直接指定します tempCar.showColor = showColor; これにより、関数を繰り返し作成するという問題は回避されますが、オブジェクト メソッドのようには見えません。 コンストラクターモード
function Car(sColor, iDoors, iMpg){
この.color = sColor;
この.doors = iDoors;
この.mpg = iMpg;
this .showColor = function (){
アラート(この.color);
};
}
var car1 =新しい車("赤", 4, 23);
var car2 =新しい車("青", 3, 25);
car1.showColor();
car2.showColor();
最初のメソッドとの違いがわかります。コンストラクター内でオブジェクトが作成されていませんが、this キーワードが使用されています。 new を使用してコンストラクターを呼び出す場合、まずオブジェクトが作成され、次に this を使用してアクセスされます。 この使い方は他のオブジェクト指向言語とよく似ていますが、この方法でも関数を繰り返し作成するという前のものと同じ問題があります。 構築に対するハイブリッド コンストラクター/プロトタイプ アプローチ
この方法は、コンストラクター メソッドとプロトタイプ メソッドの利点を組み合わせて使用する方法です。コンストラクター メソッドについては以前に紹介しました。 関数Car(){
}
Car.prototype.color = "赤";
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.showColor = function (){
アラート(この.color);
};
var car1 =新しいCar();
var car2 =新しいCar();
まず、コンストラクター Car がコードなしで定義され、次にプロトタイプを通じてプロパティが追加されます。 アドバンテージ: a. すべてのインスタンスは showColor へのポインターを格納するため、関数を繰り返し作成する問題が解決されます。 b.instanceofを使用してオブジェクトタイプを確認できます。 アラート(car1 インスタンスオブカー); //true 欠点がある場合は、次のコードを追加します。
Car.prototype.drivers = new Array("マイク", "スー");
car1.drivers.push("マット");
alert(car1.drivers); //「マイク、スー、マット」を出力します。
alert(car2.drivers); //「マイク、スー、マット」を出力します。
drivers は Array オブジェクトへのポインターであり、Car の両方のインスタンスは同じ配列を指します。
次の混合方法を使用してみましょう。 function Car(sColor, iDoors, iMpg){
この.color = sColor;
この.doors = iDoors;
この.mpg = iMpg;
this .drivers = new Array("mike", "sue");
}
Car.prototype.showColor = function (){
アラート(この.color);
};
var car1 =新しい車("赤", 4, 23);
var car2 =新しい車("青", 3, 25);
car1.drivers.push("マット");
アラート(car1.drivers);
アラート(car2.drivers);
この方法では問題はなく、instanceof を使用することもできます。 ダイナミックプロトタイピング
function Car(sColor, iDoors, iMpg){
この.color = sColor;
この.doors = iDoors;
この.mpg = iMpg;
this .drivers = new Array("mike", "sue");
if ( typeof Car.initialized == "未定義"){
Car.prototype.showColor = function (){
アラート(この.color);
};
Car.initialized = true ;
}
}
var car1 =新しい車("赤", 4, 23);
var car2 =新しい車("青", 3, 25);
car1.drivers.push("マット");
アラート(car1.drivers);
アラート(car2.drivers);
このメソッドは、すべてのクラス定義が関数内で完了するので、他の言語のクラス定義と非常によく似ており、instanceof を使用することもできます。