Wir wissen, dass JS objektorientiert ist. Wenn es um Objektorientierung geht, ist es unvermeidlich, das Konzept der Klassen einzubeziehen. Im Allgemeinen haben stark typisierte Sprachen wie C# und Java eine feste Syntax, um Klassen zu definieren. Der Unterschied zwischen JS besteht darin, dass es verschiedene Methoden verwenden kann, um seine eigenen Klassen und Objekte zu implementieren. Es gibt mehrere allgemeine Implementierungsmethoden:
1. Fabrikmethode
Die Fabrikmethode bezieht sich auf das Erstellen einer Fabrikfunktion, die einen bestimmten Objekttyp zurückgibt.
Die Codekopie lautet wie folgt:
Funktion createCar (Scolor, Idoors, Impg)
{
var otempcar = neues Objekt;
otempcar.color = scolor;
otempcar.doors = idoors;
otempcar.mpg = impg;
otempcar.showcolor = function ())
{
alarm (this.color);
}
return otempcar;
}
var ocar1 = createCar ("rot", 4,23);
var ocar2 = createCar ("blau", 3,25);
ocar1.showcolor ();
ocar2.showcolor ();
Auf diese Weise wird jedes Mal, wenn es seine Fabrikfunktion aufruft, ein neues Objekt erstellt. Das Problem ist jedoch, dass jedes Mal, wenn ein neues Objekt generiert wird, eine neue Funktion Showcolor erstellt werden muss, wodurch jedes Objekt eine eigene Version von Showcolor hat und tatsächlich alle Objekte die gleiche Funktion teilen. Ist die Methode des Objekts außerhalb der Fabrikfunktion definiert, und dann erhält das Objekt wie folgt einen Zeiger auf die Funktion
Die Codekopie lautet wie folgt:
Funktion showcolor ()
{
alarm (this.color);
}
Funktion createCar (Scolor, Idoors, Impg)
{
var otempcar = neues Objekt;
otempcar.color = scolor;
otempcar.doors = idoors;
otempcar.mpg = impg;
otempcar.showcolor = showcolor;
return otempcar;
}
var ocar1 = createCar ("rot", 4,23);
var ocar2 = createCar ("blau", 3,25);
ocar1.showcolor ();
ocar2.showcolor ();
Auf diese Weise müssen für jedes Objekt keine eigene Showcolor -Funktion erstellt werden, sondern nur einen Zeiger auf diese Funktion. Daher wird die Konstruktormethode eingeführt.
2. Konstruktormethode
Der Konstruktor ist der Fabrikfunktion sehr ähnlich, der Beispielcode lautet wie folgt:
Die Codekopie lautet wie folgt:
Funktion Car (Scolor, Idoors, Impg)
{
this.color = scolor;
this.doors = idoors;
this.mpg = impg;
this.showcolor = function ())
{
alarm (this.color);
}
}
var ocar1 = neues Auto ("rot", 4,23);
var ocar2 = neues Auto ("blau", 3,25);
Im Konstruktor wird kein internes Objekt erstellt, aber das Schlüsselwort, das verwendet wird. Wenn Sie den Konstruktor mit dem neuen Bediener aufrufen, wird ein Objekt erstellt, bevor die erste Codezeile ausgeführt werden. Aber welche Probleme werden damit passieren? Um dieses Problem zu lösen, wurde die folgende Prototypmethode eingeführt.
3. Prototypmethode
Diese Methode nutzt die Prototyp -Eigenschaft des Objekts, die als Prototyp angesehen werden kann, von dem ein neues Objekt abhängt. Verwenden Sie hier den leeren Konstruktor, um den Klassennamen festzulegen. Anschließend werden alle Methoden und Attribute direkt dem Prototyp -Attribut zugeordnet. wie folgt:
Die Codekopie lautet wie folgt:
Funktion Car ()
{}
Car.prototype.color = "rot";
Car.Prototype.doors = 4;
Car.prototype.mpg = 23;
Car.Prototype.Drivers = New Array ("Mike", "Sue");
Car.prototype.showcolor = function ())
{
alarm (this.color);
}
Die Prototypmethode kann nur direkt Werte zuweisen und die Parameter nicht an den Konstruktor übergeben, den Wert der Attributinitialisierung. Wenn Sie diese Methode verwenden, werden Sie auf zwei Probleme stoßen. Das erste Problem ist, dass jedes Objekt erstellt werden muss, bevor der Standardwert des Attributs auf diese Weise geändert werden kann. Es ist nicht möglich, die Eigenschaftswerte direkt zu haben, die Sie beim Erstellen jedes Objekts benötigen. Das ist ärgerlich. Das zweite Problem ist, wenn sich das Attribut auf das Objekt bezieht. Es wird keine Probleme mit der Funktionsaustausch geben, aber es wird Probleme mit der Verteilung von Objekten geben. Weil jede Instanz im Allgemeinen sein eigenes Objekt implementieren muss.
Wie folgt:
Die Codekopie lautet wie folgt:
var ocar1 = new Car ();
var ocar2 = new Car ();
ocar1.drivers.push ("matt");
Alert (OCAR1.DRIVERS); // Ausgabe "Mike, Sue, Matt"
Alert (Ocar2.Drivers); // Ausgabe "Mike, Sue, Matt"
Daher ist das Treiberattribut nur ein Zeiger auf das Objekt, sodass alle Instanzen tatsächlich dasselbe Objekt teilen. Aufgrund dieser Probleme führen wir die folgende Konstruktor- und Prototypmethode für Gelenknutzung ein.
4. Gemischte Konstruktor/Prototypmethode
Die Idee dieser Methode besteht darin, einen Konstruktor zu verwenden, um alle nicht funktionsfähigen Eigenschaften eines Objekts (einschließlich gewöhnlicher Eigenschaften und Attribute auf das Objekt) zu definieren und einen Prototyp zu verwenden, um die Funktioneigenschaften (Methoden) eines Objekts zu definieren. Das Ergebnis ist, dass alle Funktionen nur einmal erstellt werden und jedes Objekt eine eigene Objektattributinstanz hat. Der Beispielcode lautet wie folgt:
Die Codekopie lautet wie folgt:
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 ocar1 = neues Auto ("rot", 4,23);
var ocar2 = neues Auto ("blau", 3,25);
ocar1.drivers.push ("matt");
Alert (OCAR1.DRIVERS); // Ausgabe "Mike, Sue, Matt"
ALERT (OCAR2.DRIVERS); // Ausgabe "Mike, Sue".
Wie aus dem Beispielcode ersichtlich ist, löst diese Methode gleichzeitig zwei Probleme in der vorherigen Methode. Auf diese Weise haben einige Entwickler jedoch immer noch das Gefühl, dass es nicht perfekt ist.
5. Dynamische Prototypmethode
Wir können sehen, dass die meisten objektorientierten Sprachen Eigenschaften und Methoden visuell zusammenfassen. Die Showcolor -Methode in der obigen Methode wird jedoch außerhalb der Klasse definiert. Daher haben sie einen dynamischen Prototypansatz entwickelt. Die Grundidee dieses Ansatzes ist der gleiche wie der gemischte Konstruktor/Prototyp -Ansatz. Der einzige Unterschied ist die Position der Objektmethode. Wie unten gezeigt:
Die Codekopie lautet wie folgt:
Funktion Car (Scolor, Idoors, Impg)
{
this.color = scolor;
this.doors = idoors;
this.mpg = impg;
this.drivers = New Array ("Mike", "Sue");
if (typeof car._initialized == "undefined")
{
Car.prototype.showcolor = function ())
{
alarm (this.color);
}
}
Car._initialized = true;
}
Auf diese Weise wird Car.Prototype.showColor nur einmal erstellt. Diese Abhängigkeit macht diesen Code der Klassendefinition in anderen Sprachen mehr.
6. gemischte Fabrikmethode
Dieser Ansatz ist normalerweise eine Problemumgehung, die nicht als ersterer Ansatz verwendet werden kann. Sein Zweck ist es, einen gefälschten Konstruktor zu erstellen, der nur neue Instanzen eines anderen Objekts zurückgibt.
Die Codekopie lautet wie folgt:
Funktion createCar ()
{
var otempcar = neues Objekt;
otempcar.color = "rot";
otempcar.doors = 4;
otempcar.mpg = 23;
otempcar.showcolor = function ())
{
alarm (this.color);
};
return otempcar;
}
var Car = New Car ();
Da der neue Bediener innerhalb des CAR () -Konstruktors aufgerufen wird, wird der zweite neue Bediener automatisch ignoriert. Im Konstruktor erstellte Objekte werden an die variable var zurückgegeben. Dieser Ansatz hat die gleichen Probleme wie der klassische Ansatz in Bezug auf das interne Management von Objektmethoden. Daher wird dringend empfohlen: Vermeiden Sie diese Methode, es sei denn, dies ist absolut erforderlich.