Heim >Web-Frontend >js-Tutorial >Detaillierte Erläuterung der Vererbung in JavaScript_Javascript-Kenntnissen
Das Konzept der js-Vererbung
Die folgenden zwei Vererbungsmethoden werden häufig in js verwendet:
Prototyp-Kettenvererbung (Vererbung zwischen Objekten)
Klassenvererbung (Vererbung zwischen Konstruktoren)
Da js keine wirklich objektorientierte Sprache wie Java ist, basiert js auf Objekten und kennt kein Klassenkonzept. Wenn Sie also die Vererbung implementieren möchten, können Sie den Prototyp-Mechanismus von js oder die Apply- und Call-Methoden
In objektorientierten Sprachen verwenden wir Klassen, um ein benutzerdefiniertes Objekt zu erstellen. Allerdings ist alles in js ein Objekt. Wie erstellt man also ein benutzerdefiniertes Objekt? Dies erfordert die Verwendung des js-Prototyps:
Wir können uns den Prototyp einfach als Vorlage vorstellen. Die neu erstellten benutzerdefinierten Objekte sind alle Kopien dieser Vorlage (Prototyp) (eigentlich keine Kopien, sondern Links, aber dieser Link ist unsichtbar. Neu) Es gibt einen unsichtbaren __Proto__-Zeiger innerhalb des instanziierten Objekt, das auf das Prototypobjekt zeigt).
JS kann die Funktionen von Klassen durch Konstruktoren und Prototypen simulieren. Darüber hinaus basiert die Implementierung der JS-Klassenvererbung auch auf der Prototypenkette.
Prototypische Vererbung und Klassenvererbung
Bei der klassischen Vererbung wird der Konstruktor des Supertyps innerhalb des Konstruktors des Subtyps aufgerufen.
Die strikte Klassenvererbung ist nicht sehr verbreitet und wird normalerweise in Kombination verwendet:
Funktion Sub(){
Super.call(this);
}
Prototyp-Kettenvererbung
Damit die Unterklasse die Attribute (einschließlich Methoden) der übergeordneten Klasse erbt, müssen Sie zunächst einen Konstruktor definieren. Weisen Sie dann die neue Instanz der übergeordneten Klasse dem Prototyp des Konstruktors zu. Der Code lautet wie folgt:
Der obigen Prototyp-Kettenvererbung fehlt ein Glied, nämlich Object. Alle Konstruktoren erben von Object. Die Vererbung von Objekten erfolgt automatisch und erfordert keine manuelle Vererbung. Was ist also ihre Zugehörigkeit?
Bestimmen Sie die Beziehung zwischen Prototyp und Instanz
Die Beziehung zwischen Prototypen und Instanzen kann auf zwei Arten bestimmt werden. Operator-Instanceof- und isPrototypeof()-Methoden:
Solange es sich um einen Prototyp handelt, der in der Prototypenkette erscheint, kann man sagen, dass es sich um den Prototyp der aus der Prototypenkette abgeleiteten Instanz handelt. Daher gibt die Methode isPrototypeof() auch true zurück
In js wird die geerbte Funktion als Supertyp bezeichnet (übergeordnete Klasse, Basisklasse ist ebenfalls akzeptabel) und die geerbte Funktion wird als Untertyp (Unterklasse, abgeleitete Klasse) bezeichnet. Bei der Verwendung der prototypischen Vererbung gibt es zwei Hauptprobleme:
Erstens wird durch das wörtliche Überschreiben des Prototyps die Beziehung unterbrochen und der Prototyp des Referenztyps verwendet, und der Untertyp kann keine Parameter an den Obertyp übergeben.
Pseudoklassen lösen das Problem der Referenzfreigabe und der Unfähigkeit, Parameter von Supertypen zu übergeben. Wir können die „geliehene Konstruktor“-Technologie verwenden
Konstruktor ausleihen (Klassenvererbung)
Kombinierte Vererbung
Kombinierte Vererbung ist eine häufig verwendete Vererbungsmethode. Die Idee dahinter besteht darin, die Prototypenkette zum Erben von Prototypeigenschaften und -methoden zu verwenden und Konstruktoren zum Erben von Instanzeigenschaften auszuleihen. Auf diese Weise wird die Wiederverwendung von Funktionen durch die Definition von Methoden im Prototyp erreicht, und jede Instanz verfügt garantiert über ihre eigenen Attribute.
Verwendung von call(): Rufen Sie eine Methode eines Objekts auf und ersetzen Sie das aktuelle Objekt durch ein anderes Objekt.
Diese Art der Vererbung verwendet Prototypen, um neue Objekte basierend auf vorhandenen Objekten zu erstellen, ohne benutzerdefinierte Typen zu erstellen. Dies wird als prototypische Vererbung bezeichnet
Prototypische Vererbung erstellt zunächst einen temporären Konstruktor innerhalb der obj()-Funktion, verwendet dann das eingehende Objekt als Prototyp dieses Konstruktors und gibt schließlich eine neue Instanz dieses temporären Typs zurück.
Parasitäre Vererbung
Diese Vererbungsmethode kombiniert das Prototyp-Factory-Muster mit dem Zweck, den Erstellungsprozess zu kapseln.
Kleine Probleme bei kombinierter Vererbung
Kombinierte Vererbung ist das am häufigsten verwendete Vererbungsmuster in js, aber der Supertyp der kombinierten Vererbung wird während der Verwendung zweimal aufgerufen, einmal beim Erstellen des Untertyps und das andere Mal innerhalb des Untertypkonstruktors
Der obige Code ist die vorherige Kombinationsvererbung, sodass die parasitäre Kombinationsvererbung das Problem von zwei Aufrufen löst.
Parasitäre kombinatorische Vererbung
Anrufen und bewerben
Mit den globalen Funktionen apply und call kann der Zeiger hierfür in der Funktion wie folgt geändert werden:
// Definiere eine globale Variable
var Fruit = „Apfel“;
// Passen Sie ein Objekt an
var pack = {
Frucht: „Orange“
};
// Äquivalent zu window.foo();
foo.apply(window); // „apple“, zu diesem Zeitpunkt ist dies gleich window
//Dies in foo zu diesem Zeitpunkt === pack
foo.apply(pack); // "orange"