Ich programmiere seit über 10 Jahren mit OOP-Sprachen, lerne aber jetzt JavaScript und es ist das erste Mal, dass ich auf prototypbasierte Vererbung stoße. Ich neige dazu, am schnellsten zu lernen, indem ich guten Code studiere. Was ist ein gut geschriebenes Beispiel für eine JavaScript-Anwendung (oder Bibliothek), die die prototypische Vererbung ordnungsgemäß verwendet? Und können Sie (kurz) beschreiben, wie / wo die prototypische Vererbung verwendet wird, damit ich weiß, wo ich anfangen soll zu lesen?
javascript
prototypal-inheritance
Alex Reisner
quelle
quelle
Antworten:
Douglas Crockford hat eine schöne Seite über JavaScript Prototypal Inheritance :
Dean Edwards Base.js , Mootools's Class oder John Resigs Simple Inheritance- Werke sind Möglichkeiten, klassische Vererbung in JavaScript durchzuführen .
quelle
newObj = Object.create(oldObj);
wenn Sie es klassenfrei wollen? Andernfalls sollte das Ersetzen durcholdObj
durch das Prototypobjekt der Konstruktorfunktion funktionieren?Wie bereits erwähnt, geben die Filme von Douglas Crockford eine gute Erklärung für das Warum und das Wie. Aber um es in ein paar Zeilen JavaScript auszudrücken:
Das Problem bei diesem Ansatz ist jedoch, dass das Objekt jedes Mal neu erstellt wird, wenn Sie eines erstellen. Ein anderer Ansatz besteht darin, Ihre Objekte auf dem Prototyp-Stapel wie folgt zu deklarieren:
Es gibt einen leichten Nachteil, wenn es um Selbstbeobachtung geht. Wenn Sie testOne ausgeben, erhalten Sie weniger nützliche Informationen. Auch das Privateigentum "privateVariable" in "testOne" wird in allen Fällen gemeinsam genutzt, was in den Antworten von shesek ebenfalls hilfreich erwähnt wird.
quelle
privateVariable
einfach eine Variable im Bereich des IIFE ist und von allen Instanzen gemeinsam genutzt wird, sodass Sie keine instanzspezifischen Daten darauf speichern sollten. (auf testTwo ist es instanzspezifisch, da jeder Aufruf von testTwo () einen neuen Bereich pro Instanz erstellt)Dog.prototype
. Anstatt zu verwendenthis.bark = function () {...}
, können wir dies auchDot.prototype.bark = function () {...}
außerhalb derDog
Funktion tun . (Weitere Details in dieser Antwort )quelle
Ich würde mir YUI und Dean Edwards
Base
Bibliothek ansehen : http://dean.edwards.name/weblog/2006/03/base/Für YUI können Sie einen kurzen Blick auf das lang-Modul werfen , insb. die YAHOO.lang.extend- Methode. Anschließend können Sie die Quelle einiger Widgets oder Dienstprogramme durchsuchen und sehen, wie sie diese Methode verwenden.
quelle
lang
unterbrochen. Möchte jemand das Problem für YUI 3 beheben?Es gibt auch die ASP.NET Ajax-Bibliothek von Microsoft unter http://www.asp.net/ajax/ .
Es gibt auch viele gute MSDN-Artikel, einschließlich Erstellen erweiterter Webanwendungen mit objektorientierten Techniken .
quelle
Dies ist das klarste Beispiel, das ich aus Mixus Node-Buch ( http://book.mixu.net/node/ch6.html ) gefunden habe:
quelle
ES6
class
undextends
ES6
class
undextends
sind nur Syntaxzucker für bisher mögliche Manipulationen der Prototypenkette und damit wohl das kanonischste Setup.Weitere
.
Informationen zur Suche nach Prototypen und Eigenschaften finden Sie zunächst unter: https://stackoverflow.com/a/23877420/895245Lassen Sie uns nun dekonstruieren, was passiert:
Vereinfachtes Diagramm ohne alle vordefinierten Objekte:
quelle
Ich schlage vor, sich PrototypeJS 'Class.create:
Line 83 @ http://prototypejs.org/assets/2009/8/31/prototype.js anzusehen
quelle
Die besten Beispiele, die ich gesehen habe, sind Douglas Crockfords JavaScript: The Good Parts . Es lohnt sich auf jeden Fall zu kaufen, um eine ausgewogene Sicht auf die Sprache zu erhalten.
Douglas Crockford ist für das JSON-Format verantwortlich und arbeitet bei Yahoo als JavaScript-Guru.
quelle
Es gibt ein Snippet JavaScript Prototype-based Inheritance mit versionierungsspezifischen Implementierungen von ECMAScript. Je nach aktueller Laufzeit wird automatisch ausgewählt, welche zwischen ES6-, ES5- und ES3-Implementierungen verwendet werden soll.
quelle
Hinzufügen eines Beispiels für eine prototypbasierte Vererbung in Javascript.
ES6 verwendet eine weitaus einfachere Implementierung der Vererbung unter Verwendung von Konstruktor- und Super-Schlüsselwörtern.
quelle