Obwohl JavaScript eine objektorientierte Sprache ist, unterschied sich sein Vererbungsmechanismus seit seiner Gründung von anderen traditionellen objektorientierten Sprachen. Es ist ein prototypbasierter Vererbungsmechanismus. Nach diesem Mechanismus gibt es jedoch noch verschiedene Implementierungsmethoden für die Vererbung.
Methode 1: Klassischer Vererbung
Die sogenannte Klassenvererbung bezieht sich auf die Imitation der Vererbungsmethode traditioneller objektorientierter Sprachen. Sowohl die Erbschaft als auch die erblichen Parteien sind "Klassen". Der Code ist wie folgt:
Definieren Sie zuerst eine übergeordnete Klasse (oder eine Superklasse):
Funktionsperson (Name) {this.name = name; } Person.Prototype.getName = function () {return this.name; };Die Attribute der übergeordneten Klassenperson sind im Konstruktor definiert, die sicherstellen können, dass das Namensattribut der Unterklasse dieses Attribut nicht mit ihm erbt, sondern der Unterklasse separat gehört. Die GetName -Methode ist auf dem Prototyp montiert, um mehrere Instanzen der Unterklasse zu ermöglichen, um diesen Methodenkörper zu teilen, damit das Speicher gespeichert werden kann (für mehrere Instanzen wird jedes Mal, wenn eine Instanz von neuem herauskommt, sichergestellt, dass die GetName -Methode dieser Instanzen eher auf denselben Speicherraum als auf einen unabhängigen Raum bezieht).
Definieren Sie eine Vererbungsmethode, wie folgt:
Funktion erweitert (Unterklasse, Superklasse) {var f = function () {}; F.Prototype = SuperClass.Prototype; subclass.Prototype = new f (); subclass.Prototype.Constructor = subclass; subclass.superClass = SuperClass.Prototype; if (SuperClass.Prototype.Constructor == Object.Prototype.Constructor) {SuperClass.Prototype.Constructor = SuperClass; }}Erstellen Sie in dieser Methode zunächst eine neue Klasse F, lassen Sie seinen Prototyp der Prototyp der übergeordneten Klasse sein und lassen Sie den Prototyp der Unterklasse auf eine Instanz der Klasse F hinweisen, wodurch der Zweck der Erben der übergeordneten Klasse erreicht wird. Da der Prototyp der Unterklasse modifiziert ist, wird das Konstruktorattribut des modifizierten Prototyps auf die Unterklasse hingewiesen, so dass es eine Konstruktorfunktion hat und gleichzeitig die Unterklasse ein Superklassenattribut montieren kann. Die Unterklasse kann die übergeordnete Klasse über diese Eigenschaft aufrufen und so die Beziehung zwischen der Unterklasse und der übergeordneten Klasse festlegen.
Definieren Sie einen Autor der Unterklasse, um die Person der Elternklasse wie folgt zu erben:
Funktionsautor (Name, Bücher) {Author.SuperClass.Constructor.call (this, Name); this.book = books; } erweitern (Autor, Person); Author.Prototype.getBooks = function () {return this.book; }Hier wird der Konstruktor der übergeordneten Klasse durch sein Superklassenattribut im Konstruktor der Unterklasse aufgerufen. Gleichzeitig wird die Anrufmethode verwendet, um diesen Zeiger des Methodenaufrufs zu konvertieren, damit der Autor der Unterklasse auch die Eigenschaften der übergeordneten Klasse hat und die Unterklasse auch ein eigenes Attributbuch hat. Daher werden die Parameterbücher dem Attributbuch im Konstruktor zugeordnet, um den Konstruktionszweck zu erreichen. Verwenden Sie die Erweiterungsfunktion, um die Eigenschaften und Methoden des Personalperson -Prototyps der übergeordneten Klasse zu erben (tatsächlich werden nur die Methoden vererbt, da wir die Methoden gerade mit dem Prototyp des Prototyps befestigt haben und die Eigenschaften im Konstruktor definiert sind). Gleichzeitig verfügt der Autor über seine eigene Methode GetBooks, die sie auf dem entsprechenden Prototyp stellt und den Zweck erreicht, sich auf der Grundlage der Vererbung weiter zu erweitern.
Diese Vererbungsmethode ist offensichtlich eine Art Vererbung, die der traditionellen objektorientierten Sprache ähnelt. Der Vorteil ist, dass es für Programmierer, die an das traditionelle objektorientierte Konzept gewöhnt sind, leicht ist. Der Nachteil ist, dass der Prozess relativ umständlich ist und der Speicherverbrauch etwas größer ist, da die Unterklasse auch einen eigenen Konstruktor und Prototyp hat und die Attribute der Unterklasse und der übergeordneten Klasse vollständig isoliert sind. Auch wenn die beiden den gleichen Wert haben, können sie nicht den gleichen Speicher teilen.
Methode 2: Prototyp -Vererbung
Definieren Sie zuerst eine übergeordnete Klasse. Hier werden wir die Verwendung von Konstruktoren nicht absichtlich nachahmen, um es zu definieren, sondern ein Objekt in Form von Objektliteralen direkt zu definieren, nämlich die übergeordnete Klasse
var person = {name: 'Standardname', getName: function () {return this.name; }};Wie bei der ersten Methode verfügt das Objekt über einen Eigenschaftsnamen und eine Methode getName.
Definieren Sie dann eine Klonierungsmethode, um die Vererbung der Unterklasse in die übergeordnete Klasse zu implementieren, wie folgt:
Funktion Clone (obj) {Funktion f () {} f.Prototype = obj; Neue f () zurückgeben; }Die Klonierungsmethode erstellt ein neues Objekt, zeigt den Prototyp des Objekts auf die übergeordnete Klasse, dh den Parameter obj, und gibt das Objekt gleichzeitig zurück.
Schließlich erbt die Unterklasse die übergeordnete Klasse durch die Klonierungsfunktion wie folgt:
var Author = Clone (Person); Autor.Book = ['JavaScript']; Author.Showbook = function () {return this.book; }Hier wird eine Unterklasse definiert, und die übergeordnete Klassenperson wird durch die Klonfunktion vererbt, und ein Attributbuch wird erweitert und ein Methodshowbook wird erweitert. Hier hat die Unterklasse auch den Attributnamen, aber es ist der gleiche wie der Namenswert der übergeordneten Klasse, sodass sie nicht überschrieben ist. Wenn es anders ist, können Sie es verwenden.
Autor.Name = 'neuer Name'; Überschreiben Sie diese Eigenschaft, um einen neuen Namensattributwert der Unterklasse zu erhalten.
Dieser Prototyp -Vererbung ist einfacher und natürlicher als die Klassenvererbung. Gleichzeitig teilen sie denselben Speicherplatz, wenn die Attribute der Unterklasse und der übergeordneten Klassenattributwerte gleich sind und geändert werden können. Zum Beispiel ist das obige Namensattribut für Programmierer, die an traditionelle objektorientierte Programme gewöhnt sind, schwer zu verstehen. Wenn die beiden ausgewählt werden sollen, ist diese Methode zweifellos besser.
Da JavaScript einen prototypbasierten Ansatz zur Implementierung der Vererbung annimmt und der Prototyp jedes Objekts nur auf eine Instanz einer bestimmten Klasse (nicht auf mehrere Instanzen) hinweisen kann, wie man mehrere Erbschaft implementiert (dh eine Klasse, die Methoden und Attribute mehrerer Klassen gleichzeitig und diese Methoden nicht selbst definiert und selbst nicht zu Attributen zu Attributen)?
Im JavaScript -Designmuster wird eine Mixinklasse angegeben:
Definieren Sie zunächst eine Dopingklasse, um einige häufig verwendete Methoden und Attribute zu retten. Diese Methoden und Attribute können jeder anderen Klasse durch Erweiterung hinzugefügt werden, sodass die zusätzliche Klasse bestimmte Methoden und Attribute der Klasse enthält. Wenn mehrere Dopingklassen gleichzeitig definiert und einer Klasse hinzugefügt werden, implementiert die Klasse indirekt "Multiple Vererbung". Basierend auf dieser Idee ist die Implementierung wie folgt:
Definition der element-dominanten Klasse:
var mixin = function () {}; Mixin.prototype = {serialize: function () {var output = []; für (Schlüssel in diesem) {output.push (Schlüssel+":"+this [Schlüssel]); } return output.join (','); }}Die Dopingklasse verfügt über eine Serialisierungsmethode, um sich selbst zu durchqueren, ihre eigenen Attribute und Attributwerte auszugeben und sie als Zeichenfolgen zurückzugeben, die durch Kommas getrennt sind.
Definieren Sie eine Expansionsmethode, um eine Klasse nach der Expansion Attribute oder Methoden einer Multi-Gruppen-Klasse zu erstellen, wie folgt:
Funktionsergasung (Empfängerung, GebenCass) {if (Argumente [2]) {für (var i = 2, len = argumente.length; i <len; i ++) {empfangsklasse.Prototyp [igumente [i]] = gibsClass.Prototype [Argumente [i]]; }} else {for (methodName in givingClass.prototype) {if (! empfangereclass.prototype [methodName]) {empfangsklasse.Prototype [methodName] = gibsCass.prototype [methodName]; }}}}Diese Methode hat standardmäßig zwei Parameter. Der erste Parameter akzeptiert die erweiterte Klasse, der zweite Parameter ist die dotierte Klasse (zur Erweiterung anderer Klassen), und es kann andere Parameter geben. Wenn es größer als zwei Parameter sind, sind die nachfolgenden Parameter Methoden- oder Attributnamen, die angeben, dass die erweiterte Klasse die angegebenen Attribute oder Methoden der dotierten Klasse erben will. Andernfalls werden alle Attribute und Methoden der dotierten Klasse standardmäßig vererbt. In dieser Funktion wird der erste, wenn der Zweig verwendet wird, um die angegebenen Attribute und Methoden zu erben, und der Est -Zweig ist der Fall, in dem alle Attribute und Methoden standardmäßig vererbt werden. Die Essenz dieser Methode besteht darin, die Eigenschaften und Methoden des Prototyps der Element -Doping -Klasse auf den Prototyp der erweiterten Klasse zu erweitern (hinzuzufügen), sodass sie Eigenschaften und Methoden der Element -Doping -Klasse aufweist.
Verwenden Sie schließlich die Expansionsmethode, um mehrere Vererbung zu erreichen
Augment (Autor, Mixin); var Author = neuer Autor ('JS', ['JavaScript -Designmuster']); Alert (Autor.Serialize ());Hier ist eine Klasse von Autor. Diese Klasse erbt von der übergeordneten Klasse der Person und verfügt auch über Methoden und Eigenschaften des metabolisierten Klassenmixins. Wenn Sie möchten, können Sie n metabolisierte Klassen definieren, um die Klasse zu erweitern. Es kann auch die Eigenschaften und Methoden anderer metabolisierter Klassen erben, die Sie definieren, so dass eine multiple Vererbung realisiert wird. Schließlich lautet das Betriebsergebnis der Serialize -Methode des Autors wie folgt:
Sie werden feststellen, dass diese Klasse sowohl über die Eigenschaften als auch die Methoden der Personklasse, der Autorenklasse und der Mixin -Klasse verfügt. Die Eigenschaften und Methoden von Person und Mischung werden alle durch "Vererbung" erhalten. In der Tat erkennt es mehrere Vererbung.