Im Gegensatz zu klassenbasierten Programmiersprachen wie C und Java erfolgt die Vererbung in JavaScript prototypbasiert. Da JavaScript eine sehr flexible Sprache ist, gibt es gleichzeitig viele Möglichkeiten, die Vererbung zu implementieren.
Das erste Grundkonzept betrifft Konstruktoren und Prototypketten. Der Konstruktor des übergeordneten Objekts heißt „Parent“, der Konstruktor des untergeordneten Objekts heißt „Child“ und die entsprechenden übergeordneten und untergeordneten Objekte heißen „Parent“ bzw. „Child“.
Es gibt ein verstecktes Attribut [[Prototyp]] (Achtung: nicht Prototyp). In Chrome ist es __proto__, aber in einigen Umgebungen ist es nicht zugänglich. Es verweist auf den Prototyp dieses Objekts. Beim Zugriff auf die Eigenschaften oder Methoden eines Objekts werden zuerst alle Eigenschaften des Objekts durchsucht. Wenn sie nicht gefunden werden, werden die Eigenschaften des Prototypobjekts Schritt für Schritt entlang der Prototypkette gemäß [[Prototyp]] durchsucht, bis sie gefunden werden. Andernfalls wird undefiniert zurückgegeben.
1. Prototypenkettenvererbung:
Die Prototypkette ist die Standardmethode zur Implementierung der Vererbung in JavaScript. Wenn Sie möchten, dass ein untergeordnetes Objekt das übergeordnete Objekt erbt, besteht die einfachste Möglichkeit darin, das Prototypattribut des Konstruktors des untergeordneten Objekts auf eine Instanz des übergeordneten Objekts zu verweisen:
2. Prototypische Vererbung (Nicht-Prototyp-Kette):
Um das Problem der wiederholten Erstellung von Prototypobjektinstanzen in der vorherigen Methode zu vermeiden, können Sie den Prototyp des untergeordneten Objektkonstruktors direkt auf den Prototyp des übergeordneten Objektkonstruktors verweisen. Auf diese Weise werden alle Eigenschaften und Methoden in Parent .prototype kann auch wiederverwendet werden. Gleichzeitig ist es nicht erforderlich, wiederholt Prototypobjektinstanzen zu erstellen:
3. Temporäre Konstruktorvererbung:
Um das oben genannte Problem zu lösen, können Sie einen temporären Konstruktor als Zwischenschicht verwenden. Alle Vorgänge am untergeordneten Objektprototyp werden auf der Instanz des temporären Konstruktors ausgeführt und haben keine Auswirkungen auf den übergeordneten Objektprototyp:
Wir können die obige Arbeit in eine Funktion kapseln und durch den zukünftigen Aufruf dieser Funktion kann diese Vererbungsmethode problemlos implementiert werden:
Diese Vererbungsmethode ändert grundsätzlich nicht die Beziehung der Prototypkette, sondern kopiert alle Attribute im übergeordneten Prototypobjekt direkt in den untergeordneten Objektprototyp. Natürlich gilt die Kopie hier nur für grundlegende Datentypen und Objekttypen unterstützt nur Pass-by-Reference.
5. Vererbung zwischen Objekten:
Zusätzlich zur Vererbungsmethode zwischen Konstruktoren können Sie auch ohne Konstruktoren direkt zwischen Objekten erben. Das heißt, Objektattribute direkt kopieren, einschließlich flacher Kopie und tiefer Kopie.
Flache Kopie:
Akzeptieren Sie das zu vererbende Objekt, erstellen Sie gleichzeitig ein neues leeres Objekt, kopieren Sie die Eigenschaften des zu vererbenden Objekts in das neue Objekt und geben Sie das neue Objekt zurück:
Deep Copy:
Das Problem der flachen Kopie ist ebenfalls offensichtlich. Sie kann die Attribute des Objekttyps nicht kopieren, sondern nur die Referenz übergeben. Um dieses Problem zu lösen, muss eine tiefe Kopie verwendet werden. Der Schwerpunkt von Deep Copy liegt im rekursiven Aufruf von copy. Wenn die Eigenschaften des Objekttyps erkannt werden, wird das entsprechende Objekt oder Array erstellt und die Grundtypwerte werden nacheinander kopiert.
6. Prototypische Vererbung:
Erstellen Sie mit Hilfe des übergeordneten Objekts über den Konstruktor ein neues Objekt, das vom übergeordneten Objekt als Prototyp erstellt wurde:
7. Utilisation mixte de l'héritage prototypique et de la copie d'attributs :
Dans la méthode d'héritage prototypique, l'objet enfant est construit sur la base de l'objet parent transmis. En même temps, en plus des propriétés fournies par l'objet parent, des objets supplémentaires qui doivent être copiés peuvent être transmis :
pour (var i dans les trucs) {
n[i] = trucs[i]
>
Retour n
>
Cette méthode n'implique pas le fonctionnement de la chaîne de prototypes. Plusieurs objets dont les attributs doivent être copiés sont transmis et tous les attributs sont copiés dans l'ordre :
9. Emprunt constructeur :
Les méthodes call() et apply() en JavaScript sont très simples à utiliser, et leur fonction de modification du contexte d'exécution de la méthode peut également jouer un rôle dans la mise en œuvre de l'héritage. Le soi-disant emprunt de constructeur fait référence à l'emprunt du constructeur de l'objet parent dans le constructeur de l'objet enfant pour opérer ceci :
fonction Enfant() {
Parent.apply(ce, arguments)
>
var enfant = nouvel enfant()
console.log(enfant.nom)
L'inconvénient de cette méthode est que l'opérateur new n'est pas utilisé pendant le processus de construction de l'objet enfant, donc l'objet enfant n'héritera d'aucun attribut de l'objet prototype parent dans le code ci-dessus, l'attribut name du. l'enfant ne sera pas défini.
Pour résoudre ce problème, vous pouvez à nouveau définir manuellement le prototype du constructeur d'objet enfant sur une instance de l'objet parent :
Pour résoudre ce problème, nous devons supprimer un appel au constructeur de l'objet parent. L'emprunt du constructeur ne peut pas être omis, donc le dernier appel ne peut être supprimé qu'une autre façon d'implémenter l'héritage du prototype consiste à copier de manière itérative :
.