Detaillierte Erklärung von Prototypen und Prototypenketten in JavaScript

Detaillierte Erklärung von Prototypen und Prototypenketten in JavaScript

Prototyp-Kettendiagramm

Bildbeschreibung hier einfügen

Grundlegendes Wissen für das Prototyping

Um den Prototyp zu verstehen, müssen Sie drei Eigenschaften verstehen: __proto__ , prototype und constructor .

1.__proto__ und Konstruktorattribute sind für Objekte eindeutig;

2. Die Prototypeigenschaft ist nur Funktionen vorbehalten.

3. In js sind Funktionen auch ein Objekttyp, daher haben Funktionen auch die Eigenschaften __proto__ und Konstruktor;

Fünf Regeln des Prototyps:

1. Alle Referenztypen (Objekte, Arrays, Funktionen) haben Objekteigenschaften, d. h. sie können Eigenschaften frei erweitern

2. Alle Referenztypen (Objekte, Arrays, Funktionen) haben ein Attribut __proto__ (impliziter Prototyp), das ein normales Objekt ist

3. Alle Funktionen haben eine Prototyp-Eigenschaft (expliziter Prototyp), die auch ein normales Objekt ist

4. Alle Referenztypen (Objekte, Arrays, Funktionen) __proto__-Werte zeigen auf den Prototyp seines Konstruktors

5. Wenn beim Versuch, die Eigenschaft eines Objekts abzurufen, die Variable selbst diese Eigenschaft nicht besitzt, wird in ihrem __proto__ danach gesucht.

Prototypeigenschaft (Prototyp anzeigen)

Erstellen Sie zuerst einen Konstruktor

var Übergeordnetes Element = Funktion(){
}
//Definieren Sie eine Funktion. Es ist nur eine gewöhnliche Funktion. var p1 = new Parent();
//Durch das Schlüsselwort new wird Parent zum Konstruktor //Erstellt eine Instanz eines Parent-Konstruktors p1

prototype ist eine eindeutige Eigenschaft der Funktion, über die auf den Prototyp zugegriffen werden kann.

prototype wurde ursprünglich entwickelt, um Vererbung zu erreichen, sodass alle von einer bestimmten Funktion erstellten Instanzen Eigenschaften und Methoden gemeinsam nutzen können, oder man kann sagen, dass alle von einem bestimmten Konstruktor instanziierten Objekte gemeinsame Methoden und Eigenschaften finden können. Mit prototype müssen wir nicht für jede Instanz doppelte Eigenschaftsmethoden erstellen. Stattdessen erstellen wir die Eigenschaftsmethoden auf dem Prototypobjekt (Prototyp) der Konstruktorfunktion. Diejenigen, die nicht freigegeben werden müssen, werden im Konstruktor erstellt.

Parent ist der Konstruktor, Parent.prototype ist der Prototyp

Bildbeschreibung hier einfügen

Die zu Parent.prototype hinzugefügten Eigenschaften und Methoden werden als Prototypeigenschaften und Prototypmethoden bezeichnet und Instanzen des Konstruktors können auf sie zugreifen und sie aufrufen.

Proto-Eigenschaft (impliziter Prototyp)

Die Eigenschaft __proto__ ist für Objekte (einschließlich Funktionen) eindeutig.

Jedes Objekt hat eine __proto__-Eigenschaft, die auf das Prototypobjekt des Objekts verweist.

p1.__proto__ === Übergeordneter.Prototyp; // wahr

__proto__ wird normalerweise als impliziter Prototyp bezeichnet, und Prototyp wird normalerweise als expliziter Prototyp bezeichnet. Man kann sagen, dass der implizite Prototyp eines Objekts auf den expliziten Prototyp des Konstruktors des Objekts verweist. Anschließend werden die im expliziten Prototyp definierten Eigenschaftsmethoden über den impliziten Prototyp an die Instanz des Konstruktors übergeben. Auf diese Weise kann die Instanz einfach auf die Methoden und Eigenschaften des Konstruktor-Prototyps zugreifen.

Der implizite Prototyp von Parent.prototype verweist auf den Objektprototyp

Parent.prototype.__proto__ === Objekt.prototype; //wahr

Bildbeschreibung hier einfügen

Dies führt das Konzept der Prototypenkette ein. Wenn p1.toString() aufgerufen wird, sucht es zuerst nach dem p1-Objekt selbst. Wenn es nicht gefunden wird, sucht es nach dem Prototypobjekt Parent.prototype bis p1.__proto__. Wenn es nicht gefunden wird, sucht es nach dem übergeordneten Prototypobjekt Object.prototype bis Parent.prototype.__proto__ . Die toString-Methode befindet sich auf dieser Ebene. Gibt die Methode zur Verwendung durch p1 zurück.

Wenn es nicht in Object.prototype gefunden wird, wird natürlich in Object.prototype.__proto__ danach gesucht, aber Object.prototype.__proto__ === null , sodass „undefined“ zurückgegeben wird. Aus diesem Grund wird beim Zugriff auf eine nicht vorhandene Eigenschaft eines Objekts „undefined“ zurückgegeben.

Die Konstruktor-Eigenschaft

Da die Konstruktorfunktion über den Prototyp auf den Prototyp zugreift, sollte der Prototyp auch über eine gewisse Mittel, nämlich den Konstruktor, auf die Konstruktorfunktion zugreifen können.

Wie im vorherigen Beispiel ist p1 ein Objekt und der Konstruktor von p1 ist Parent(). Der Konstruktor des übergeordneten Elements ist Function()

p1.constructor => f Elternteil{}
Parent.constructor => f Funktion() { [nativer Code] }
Function.constructor => ƒ Function() { [nativer Code] }

Die Funktion ist der Stammkonstruktor aller Funktionen.

Aus dem Beispiel können wir ersehen, dass constructor Konstruktoreigenschaft von p1 auf Parent verweist, sodass Parent der Konstruktor von p1 ist. In ähnlicher Weise verweist die Konstruktoreigenschaft des übergeordneten Elements auf die Funktion, sodass die Funktion der Konstruktor des übergeordneten Elements ist. Anschließend wird überprüft, ob die Funktion der Stammkonstruktor ist.

Bildbeschreibung hier einfügen

Zusammenfassen

Dieser Artikel endet hier. Ich hoffe, er kann Ihnen helfen. Ich hoffe auch, dass Sie mehr Inhalt auf 123WORDPRESS.COM lesen können!

Das könnte Sie auch interessieren:
  • Grundlegendes zur JavaScript-Prototypenkette
  • Details zum JavaScript-Prototyp und zur Prototypkette
  • Tiefgreifendes Verständnis von Javascript-Prototypen und Prototypenketten
  • Kennen Sie Javascript-Prototypen und Prototypenketten?
  • Detaillierte Erläuterung des JavaScript-Prototyps und der Prototypenkette
  • Prototypen und Prototypenketten in JavaScript verstehen

<<:  Reines CSS zum Ändern der Layoutgröße durch Ziehen nach links und rechts

>>:  Beispiele für die Verwendung von ungeordneten Listen-Tags und geordneten Listen-Tags im HTML-Format

Artikel empfehlen

Vue implementiert einfache Kommentarfunktion

In diesem Artikel wird der spezifische Code von V...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.16 winx64

Ich habe erst vor Kurzem angefangen, mich mit Dat...

Import-, Export-, Sicherungs- und Migrationsvorgänge für Docker-Images

Export: docker save -o centos.tar centos:latest #...

Detaillierte Erklärung der Verwendung des Fuser-Befehls in Linux

beschreiben: fuser kann anzeigen, welches Program...

Erfahren Sie, wie Sie den Zabbix-Dienst auf Saltstack bereitstellen

Inhaltsverzeichnis Saltstack stellt Zabbix-Dienst...

Drei Möglichkeiten, doppeltes Einfügen von Daten in MySql zu vermeiden

Vorwort Im Falle eines Primärschlüsselkonflikts o...

So richten Sie eine automatische tägliche Datenbanksicherung in Linux ein

Dieser Artikel verwendet das Centos7.6-System und...

Kopieren Sie den Inhalt einer Datei an das Ende einer anderen Datei in Linux

Problembeschreibung: Der Inhalt der Datei 11 laut...

Vue-Anfängerhandbuch: Umgebungserstellung und Erste Schritte

Inhaltsverzeichnis Erster Blick Erstellen einer V...