Es gibt mehrere gängige Methoden zum Definieren von Klassen oder Objekten in JavaScript: Fabrikansatz
Funktion createCar(color, Türen, mpg){
var tempCar = neues Objekt;
tempCar.color = Farbe;
tempCar.doors = Türen;
tempCar.mpg = mpg;
tempCar.showColor = function (){
alarm( this .color);
};
return tempCar;
}
var car1 = createCar("red", 4, 23);
var car2 = createCar("blue", 3, 25);
car1.showColor();
car2.showColor();
Es wurde eine Factory-Funktion definiert, die Objekte eines bestimmten Typs erstellen und zurückgeben kann, aber es gibt ein kleines Problem. Bei jedem Aufruf muss eine neue Funktion erstellt werden. Funktion showColor(){ alarm(this.color); } Zeigen Sie direkt in der Factory-Funktion darauf tempCar.showColor = showColor; Dadurch wird das Problem der wiederholten Erstellung von Funktionen vermieden, es sieht jedoch nicht wie eine Objektmethode aus. Konstruktormodus
Funktion Car(sColor, iDoors, iMpg){
this .color = sColor;
this .doors = iDoors;
dieses .mpg = iMpg;
this .showColor = function (){
alarm( this .color);
};
}
var car1 = neues Auto("red", 4, 23);
var car2 = neues Auto("blau", 3, 25);
car1.showColor();
car2.showColor();
Sie können den Unterschied zur ersten Methode erkennen. Im Konstruktor wird kein Objekt erstellt, sondern das Schlüsselwort this verwendet. Beim Aufruf des Konstruktors mit new wird zunächst ein Objekt erstellt und dann über dieses aufgerufen. Diese Verwendung ist anderen objektorientierten Sprachen sehr ähnlich, diese Methode weist jedoch das gleiche Problem wie die vorherige auf, nämlich die wiederholte Erstellung von Funktionen. Ein hybrider Konstrukteur/Prototyp-Ansatz für die Konstruktion
Diese Methode besteht darin, die Konstruktormethode und die Prototypmethode gleichzeitig zu verwenden. Die Konstruktormethode wurde bereits vorgestellt. Funktion Car(){
}
Car.prototype.color = "red";
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.showColor = function (){
alarm( this .color);
};
var car1 = neues Auto();
var car2 = neues Auto();
Zuerst wird der Konstruktor Car ohne Code definiert und dann werden die Eigenschaften über den Prototyp hinzugefügt Vorteil: a. Alle Instanzen speichern Zeiger auf showColor, wodurch das Problem der wiederholten Erstellung von Funktionen gelöst wird. b. Sie können „instanceof“ verwenden, um den Objekttyp zu überprüfen Alert(car1 Instanz von Car); //true Nachteile, fügen Sie den folgenden Code hinzu:
Car.prototype.drivers = new Array("mike", "sue");
car1.drivers.push("matt");
Alert(car1.drivers); //gibt „mike,sue,matt“ aus
Alert(car2.drivers); //gibt „mike,sue,matt“ aus
Treiber sind Zeiger auf Array-Objekte, und beide Instanzen von Car zeigen auf dasselbe Array.
Lassen Sie uns die folgende Mischmethode verwenden: Funktion Car(sColor, iDoors, iMpg){
this .color = sColor;
this .doors = iDoors;
this .mpg = iMpg;
this .drivers = new Array("mike", "sue");
}
Car.prototype.showColor = function (){
alarm( this .color);
};
var car1 = neues Auto("red", 4, 23);
var car2 = neues Auto("blau", 3, 25);
car1.drivers.push("matt");
alarm(car1.drivers);
alarm(car2.drivers);
Auf diese Weise gibt es kein Problem und Sie können auch Instanzen verwenden dynamisches Prototyping
Funktion Car(sColor, iDoors, iMpg){
this .color = sColor;
this .doors = iDoors;
dieses .mpg = iMpg;
this .drivers = new Array("mike", "sue");
if ( typeof Car.initialized == "undefiniert"){
Car.prototype.showColor = function (){
alarm( this .color);
};
Car.initialized = true ;
}
}
var car1 = neues Auto("red", 4, 23);
var car2 = neues Auto("blau", 3, 25);
car1.drivers.push("matt");
alarm(car1.drivers);
alarm(car2.drivers);
Diese Methode ist meine Lieblingsmethode. Es sieht so aus, als ob Klassendefinitionen in anderen Sprachen nicht wiederholt werden