Ich bevorzuge es, OOP in großen Projekten zu verwenden, wie dem, an dem ich gerade arbeite. Ich muss mehrere Klassen in JavaScript erstellen, aber wenn ich mich nicht irre, gibt es mindestens ein paar Möglichkeiten, dies zu tun. Was wäre die Syntax und warum würde es so gemacht werden?
Ich möchte die Verwendung von Bibliotheken von Drittanbietern vermeiden - zumindest zunächst.
Auf der Suche nach anderen Antworten fand ich den Artikel Objektorientierte Programmierung mit JavaScript, Teil I: Vererbung - Doc JavaScript , in dem die objektorientierte Programmierung in JavaScript behandelt wird. Gibt es einen besseren Weg, um Vererbung zu machen?
javascript
oop
class
Karim
quelle
quelle
Antworten:
So geht's, ohne externe Bibliotheken zu verwenden:
Jetzt ist die eigentliche Antwort viel komplexer. Zum Beispiel gibt es in JavaScript keine Klassen. JavaScript verwendet ein
prototype
Vererbungsschema auf Basis.Darüber hinaus gibt es zahlreiche beliebte JavaScript-Bibliotheken, die ihren eigenen Stil zur Annäherung an klassenähnliche Funktionen in JavaScript haben. Sie sollten mindestens Prototype und jQuery ausprobieren .
Die Entscheidung, welche davon die "beste" ist, ist eine großartige Möglichkeit, einen heiligen Krieg gegen den Stapelüberlauf zu beginnen. Wenn Sie ein größeres JavaScript-lastiges Projekt starten, lohnt es sich auf jeden Fall, eine beliebte Bibliothek zu lernen und es auf ihre Weise zu tun. Ich bin ein Prototyp, aber Stack Overflow scheint sich zu jQuery zu neigen.
Soweit es nur "einen Weg gibt", ohne Abhängigkeiten von externen Bibliotheken, ist die Art und Weise, wie ich geschrieben habe, so ziemlich das Richtige.
quelle
Der beste Weg, eine Klasse in JavaScript zu definieren, besteht darin, keine Klasse zu definieren.
Ernsthaft.
Es gibt verschiedene Arten der Objektorientierung, einige davon sind:
Und wahrscheinlich andere, von denen ich nichts weiß.
JavaScript implementiert prototypbasiertes OO. In prototypbasiertem OO werden neue Objekte durch Kopieren anderer Objekte erstellt (anstatt aus einer Klassenvorlage instanziiert zu werden), und Methoden werden direkt in Objekten anstatt in Klassen ausgeführt. Die Vererbung erfolgt über die Delegierung: Wenn ein Objekt keine Methode oder Eigenschaft hat, wird es anhand seiner Prototypen (dh des Objekts, von dem es geklont wurde), der Prototypen des Prototyps usw. nachgeschlagen.
Mit anderen Worten: Es gibt keine Klassen.
JavaScript hat tatsächlich eine nette Optimierung dieses Modells: Konstruktoren. Sie können Objekte nicht nur erstellen, indem Sie vorhandene kopieren, sondern sie auch sozusagen "aus dem Nichts" konstruieren. Wenn Sie eine Funktion mit dem
new
Schlüsselwort aufrufen , wird diese Funktion zu einem Konstruktor, und dasthis
Schlüsselwort verweist nicht auf das aktuelle Objekt, sondern auf ein neu erstelltes "leeres". So können Sie ein Objekt beliebig konfigurieren. Auf diese Weise können JavaScript-Konstruktoren eine der Rollen von Klassen in herkömmlichem klassenbasiertem OO übernehmen: Sie dienen als Vorlage oder Blaupause für neue Objekte.Jetzt ist JavaScript eine sehr leistungsfähige Sprache, so dass es recht einfach ist, ein klassenbasiertes OO-System in JavaScript zu implementieren, wenn Sie möchten. Sie sollten dies jedoch nur tun, wenn Sie es wirklich brauchen und nicht nur, weil Java es so macht.
quelle
ES2015 Klassen
In der ES2015-Spezifikation können Sie die Klassensyntax verwenden, die nur Zucker über dem Prototypsystem ist.
Leistungen
Der Hauptvorteil besteht darin, dass statische Analysewerkzeuge es einfacher finden, diese Syntax gezielt einzusetzen. Es ist auch für andere, die aus klassenbasierten Sprachen kommen, einfacher, die Sprache als Polyglot zu verwenden.
Vorsichtsmaßnahmen
Seien Sie vorsichtig bei den aktuellen Einschränkungen. Um private Eigenschaften zu erreichen, muss auf die Verwendung von Symbolen oder WeakMaps zurückgegriffen werden . In zukünftigen Versionen werden Klassen höchstwahrscheinlich um diese fehlenden Funktionen erweitert.
Unterstützung
Die Browserunterstützung ist derzeit nicht sehr gut (wird von fast allen außer IE unterstützt), aber Sie können diese Funktionen jetzt mit einem Transpiler wie Babel verwenden .
Ressourcen
quelle
Ich bevorzuge Daniel X. Moores
{SUPER: SYSTEM}
. Dies ist eine Disziplin, die Vorteile wie echte Instanzvariablen, traitbasierte Vererbung, Klassenhierarchien und Konfigurationsoptionen bietet. Das folgende Beispiel zeigt die Verwendung von echten Instanzvariablen, was meiner Meinung nach der größte Vorteil ist. Wenn Sie keine Instanzvariablen benötigen und nur mit öffentlichen oder privaten Variablen zufrieden sind, gibt es wahrscheinlich einfachere Systeme.Wow, das ist für sich genommen nicht wirklich nützlich, aber sehen Sie sich das Hinzufügen einer Unterklasse an:
Ein weiterer Vorteil ist die Möglichkeit, Module und eine auf Merkmalen basierende Vererbung zu haben.
Ein Beispiel für die Personenklasse ist das bindbare Modul.
Offenlegung: Ich bin Daniel X. Moore und das ist mein
{SUPER: SYSTEM}
. Dies ist der beste Weg, um eine Klasse in JavaScript zu definieren.quelle
quelle
Im Folgenden finden Sie die Möglichkeiten zum Erstellen von Objekten in Javascript, die ich bisher verwendet habe
Beispiel 1:
Beispiel 2:
Beispiel 3:
Beispiel 4: Tatsächliche Vorteile von Object.create (). Bitte beziehen Sie sich auf [diesen Link]
Beispiel 5 (angepasstes Crockford's Object.create):
Um die Antwort mit ES6 / ES2015 auf dem neuesten Stand zu halten
Eine Klasse ist wie folgt definiert:
quelle
Ich denke, Sie sollten Douglas Crockfords Prototypal Inheritance in JavaScript und Classical Inheritance in JavaScript lesen .
Beispiele von seiner Seite:
Bewirken? Sie können Methoden auf elegantere Weise hinzufügen:
Ich empfehle auch seine Videos: Advanced JavaScript .
Weitere Videos finden Sie auf seiner Seite: http://javascript.crockford.com/ Im John Reisig-Buch finden Sie viele Beispiele auf der Website von Douglas Crockfor.
quelle
'strings'
Namen viele Dinge nennen, aber elegant ist keine davon ...Weil ich den YUI / Crockford-Fabrikplan nicht zugeben werde und weil ich die Dinge gerne in sich geschlossen und erweiterbar halte, ist dies meine Variante:
wo idealerweise die Art des Tests auf so etwas wie der ersten prototypisierten Methode ist
quelle
Wenn Sie einfach vorgehen, können Sie das Schlüsselwort "new" vollständig vermeiden und einfach Factory-Methoden verwenden. Ich bevorzuge dies manchmal, weil ich JSON gerne zum Erstellen von Objekten verwende.
Ich bin mir jedoch nicht sicher, wie hoch die Leistung bei großen Objekten ist.
quelle
Auf diese Weise kompiliert TypeScript die Klasse mit dem Konstruktor in JavaScript.
quelle
Der einfache Weg ist:
Der Grund dafür
that
ist, dassthis
dies an etwas anderes gebunden sein kann, wenn Sie eine Methode als Ereignishandler angeben, sodass Sie den Wert während der Instanziierung speichern und später verwenden.Bearbeiten: Es ist definitiv nicht der beste Weg, nur ein einfacher Weg. Ich warte auch auf gute Antworten!
quelle
Sie möchten wahrscheinlich einen Typ mithilfe des Faltmusters erstellen:
Dieser Code gibt Ihnen einen Typ namens myType . Es wird interne private Felder haben, die als Toggle und Text bezeichnet werden . Es wird auch diese exponierten Mitglieder haben: die Felder zählen und Zahlen ; die Eigenschaften wechseln , Text und numberLength ; die Methoden incrementNumbersByCount und tweak .
Das Faltmuster wird hier ausführlich beschrieben: Javascript-Faltmuster
quelle
Code Golf für die Antwort von @ liammclennan .
quelle
MooTools (My Object Oriented Tools) konzentriert sich auf die Idee von Klassen . Sie können sogar mit Vererbung erweitern und implementieren.
Wenn es gemeistert wird, entsteht ein lächerlich wiederverwendbares, leistungsstarkes Javascript.
quelle
Objektbasierte Klassen mit Vererbung
Einfach, süß und erledigt.
quelle
Eine Basis
Eine Klasse
Aktion
quelle
Am Beispiel des Triptychons könnte dies sogar einfacher sein:
Dies erstellt nur eine einzelne Objektinstanz, ist jedoch weiterhin nützlich, wenn Sie eine Reihe von Namen für Variablen und Methoden in einer Klasse kapseln möchten. Normalerweise gibt es keine "Bob, M" -Argumente für den Konstruktor, beispielsweise wenn die Methoden ein System mit eigenen Daten aufrufen würden, z. B. eine Datenbank oder ein Netzwerk.
Ich bin noch zu neu bei JS, um zu sehen, warum dies das
prototype
Ding nicht benutzt .quelle
JavaScript ist objektorientiert , unterscheidet sich jedoch grundlegend von anderen OOP- Sprachen wie Java, C # oder C ++. Versuche nicht, es so zu verstehen. Wirf das alte Wissen raus und fange von vorne an. JavaScript braucht ein anderes Denken.
Ich würde vorschlagen, ein gutes Handbuch oder etwas zu diesem Thema zu bekommen.
Ich selbst fand ExtJS-Tutorials am besten für mich, obwohl ich das Framework vor oder nach dem Lesen nicht verwendet habe. Aber es gibt eine gute Erklärung dafür, was was in der JavaScript-Welt ist.Entschuldigung, es scheint, dass dieser Inhalt entfernt wurde. Hier ist stattdessen ein Link zur Kopie von archive.org . Funktioniert heute. : P.quelle
quelle