In PHP / Java kann man:
class Sub extends Base
{
}
Und automatisch werden alle öffentlichen / geschützten Methoden, Eigenschaften, Felder usw. der Super-Klasse Teil der Sub-Klasse, die bei Bedarf überschrieben werden können.
Was ist das Äquivalent dazu in Javascript?
javascript
oop
Klicken Sie auf Upvote
quelle
quelle
Antworten:
Ich habe
prototype
meine Vorgehensweise jetzt geändert. Ich versuche, die Verwendung von Konstruktorfunktionen und deren Eigenschaften zu vermeiden , aber meine alte Antwort aus dem Jahr 2010 ist immer noch ganz unten. Ich bevorzuge jetztObject.create()
.Object.create
ist in allen modernen Browsern verfügbar.Ich sollte beachten, dass dies
Object.create
normalerweise viel langsamer ist als die Verwendungnew
mit einem Funktionskonstruktor.jsfiddle
Einer der großen Vorteile der Verwendung von Object.create besteht darin , dass Sie ein defineProperties- Argument übergeben können, mit dem Sie maßgeblich steuern können, wie auf Eigenschaften der Klasse zugegriffen und diese aufgelistet werden können. Außerdem verwende ich Funktionen zum Erstellen von Instanzen, die als solche dienen Konstruktoren in gewisser Weise, da Sie die Initialisierung am Ende durchführen können, anstatt nur die Instanz zurückzugeben.
jsfiddle
Dies ist meine ursprüngliche Antwort aus dem Jahr 2010:
quelle
alert()
sehe, wasinstance.showColor()
zurückkommt, bekomme ich immer nochundefined
. jsbin.com/uqalin/1In JavaScript gibt es keine Klassen, aber Sie können Vererbung und Wiederverwendung von Verhalten auf viele Arten erhalten:
Pseudoklassische Vererbung (durch Prototyping):
Sollte mit dem
new
Bediener verwendet werden:Funktionsanwendung oder "Konstruktorkettung":
Dieser Ansatz sollte auch beim
new
Bediener angewendet werden:Der Unterschied zum ersten Beispiel besteht darin, dass, wenn wir
apply
denSuper
Konstruktor zumthis
Objekt im InnerenSub
hinzufügen, die Eigenschaften hinzugefügt werden, diethis
on zugewiesen wurdenSuper
, direkt in der neuen Instanz, z. B.subInstance
die Eigenschaften enthältmember1
undmember2
direkt (subInstance.hasOwnProperty('member1') == true;
).Im ersten Beispiel werden diese Eigenschaften über die Prototypenkette erreicht , sie existieren auf einem internen
[[Prototype]]
Objekt.Parasitäre Vererbung oder Leistungskonstruktoren:
Dieser Ansatz basiert im Wesentlichen auf "Objekterweiterung", Sie müssen den
new
Operator nicht verwenden, und wie Sie sehen können, ist dasthis
Schlüsselwort nicht beteiligt.ECMAScript 5th Ed.
Object.create
Methode:Das obige Verfahren ist eine von Crockford vorgeschlagene prototypische Vererbungstechnik .
Objektinstanzen erben von anderen Objektinstanzen, das war's.
Diese Technik kann besser sein als eine einfache "Objekterweiterung", da die geerbten Eigenschaften nicht über alle neuen Objektinstanzen kopiert werden, da das Basisobjekt als das
[[Prototype]]
des erweiterten Objekts festgelegt ist und im obigen BeispielsubInstance
nur diemember3
Eigenschaft enthält.quelle
Object.create()
oder eine benutzerdefinierteclone()
Funktion (z. B. mercurial.intuxication.org/hg/js-hacks/raw-file/tip/clone.js ), um direkt vom Prototypobjekt zu erben. Eine Erklärung finden Sie in den Kommentaren zu stackoverflow.com/questions/1404559/…Object.create
Methode erwähnen :)member1
Variable, was überhaupt nicht wünschenswert ist. Natürlich können sie es umschreiben, aber das macht einfach keinen Sinn. github.com/dotnetwise/Javascript-FastClass ist eine bessere Zuckerlösung.Sub.prototype = new Super();
. Was ist, wenn beide Klassen während der Skriptausführung niemals verwendet werden? Es sieht nach einem Leistungsproblem aus. Warum muss ich eine übergeordnete Klasse erstellen, wenn die untergeordnete Klasse nicht tatsächlich verwendet wird? Können Sie bitte näher darauf eingehen? Hier ist die einfache Demonstration des Problems: jsfiddle.net/slavafomin/ZeVL2 Danke!Für diejenigen, die diese Seite im Jahr 2019 oder später erreichen
Mit der neuesten Version des ECMAScript-Standards (ES6) können Sie das Schlüsselwort verwenden
class
.Beachten Sie, dass die Klassendefinition keine reguläre ist
object
. Daher gibt es keine Kommas zwischen den Klassenmitgliedern. Um eine Instanz einer Klasse zu erstellen, müssen Sie dasnew
Schlüsselwort verwenden. Verwenden Sie zum Erben von einer Basisklasseextends
:Verwenden Sie zum Erben von einer Basisklasse
extends
:Aus der abgeleiteten Klasse können Sie Super von jedem Konstruktor oder jeder Methode verwenden, um auf die Basisklasse zuzugreifen:
super().
super.getName()
.Es gibt mehr zu Klassen. Wenn Sie tiefer in das Thema eintauchen möchten, empfehle ich “ Klassen in ECMAScript 6 “ von Dr. Axel Rauschmayer. *
Quelle
quelle
class
undextends
(äußerst nützlicher) SyntaxzuckerNun, in JavaScript gibt es keine "Klassenvererbung", sondern nur eine "Prototypvererbung". Sie machen also keine Klasse "LKW" und markieren sie dann als Unterklasse von "Automobil". Stattdessen machen Sie ein Objekt "Jack" und sagen, dass es "John" als Prototyp verwendet. Wenn John weiß, wie viel "4 + 4" ist, dann weiß Jack es auch.
Ich schlage vor, dass Sie Douglas Crockfords Artikel über die Vererbung von Prototypen hier lesen: http://javascript.crockford.com/prototypal.html Er zeigt auch, wie Sie JavaScript wie in anderen OO-Sprachen "ähnlich" vererben können, und erklärt dies dann bedeutet eigentlich, JavaScript so zu brechen, dass es nicht verwendet werden sollte.
quelle
Ich finde dieses Zitat am aufschlussreichsten:
Ich verwende lieber Konstruktoren als Objekte, daher bin ich Teil der hier von CMS beschriebenen "pseudoklassischen Vererbungsmethode" . Hier ist ein Beispiel für die Mehrfachvererbung mit einer Prototypkette :
Hier ist eine weitere gute Ressource von MDN , und hier ist eine jsfiddle, damit Sie sie ausprobieren können .
quelle
Die Vererbung von Javascript unterscheidet sich ein wenig von Java und PHP, da es nicht wirklich Klassen gibt. Stattdessen verfügt es über Prototypobjekte, die Methoden und Elementvariablen bereitstellen. Sie können diese Prototypen verketten, um die Objektvererbung bereitzustellen. Das häufigste Muster, das ich bei der Untersuchung dieser Frage gefunden habe, ist im Mozilla Developer Network beschrieben . Ich habe ihr Beispiel aktualisiert, um einen Aufruf einer Superklassenmethode aufzunehmen und das Protokoll in einer Warnmeldung anzuzeigen:
Persönlich finde ich die Vererbung in Javascript umständlich, aber dies ist die beste Version, die ich gefunden habe.
quelle
Sie können nicht (im klassischen Sinne). Javascript ist eine prototypische Sprache. Sie werden feststellen, dass Sie in Javascript niemals eine "Klasse" deklarieren. Sie definieren lediglich den Status und die Methoden eines Objekts. Um eine Vererbung zu erzeugen, nehmen Sie ein Objekt und erstellen einen Prototyp. Der Prototyp wird um neue Funktionen erweitert.
quelle
Sie können
.inheritWith
und.fastClass
Bibliothek verwenden . Es ist schneller als die meisten gängigen Bibliotheken und manchmal sogar schneller als die native Version.Sehr einfach zu bedienen:
Verwendung
quelle
quelle
Nachdem ich viele Beiträge gelesen hatte, kam ich auf diese Lösung ( jsfiddle hier ). Meistens brauche ich nichts Anspruchsvolleres
quelle
Dank der Antwort von CMS und nachdem ich eine Weile mit Prototyp und Object.create herumgespielt hatte und was nicht, konnte ich eine saubere Lösung für meine Vererbung mit apply finden, wie hier gezeigt:
quelle
Ab ES2015 wird genau so in JavaScript vererbt
quelle
quelle
ES6-Klassen:
Javascript hat keine Klassen. Klassen in Javascript sind nur syntaktischer Zucker, der auf dem prototypischen Vererbungsmuster von Javascript aufbaut. Sie können JS verwenden
class
, um die prototypische Vererbung zu erzwingen. Es ist jedoch wichtig zu wissen, dass Sie tatsächlich noch Konstruktorfunktionen unter der Haube verwenden.Diese Konzepte gelten auch, wenn Sie
es6
mit dem Schlüsselwort extenses von einer 'Klasse' aus erweitern. Dies schafft nur ein zusätzliches Glied in der Prototypenkette. Das__proto__
Beispiel:
Object.create ()
Object.create()
ist auch eine Möglichkeit, eine Vererbung in JS in Javascript zu erstellen.Object.create()
ist eine Funktion, die ein neues Objekt erstellt und ein vorhandenes Objekt als Argument verwendet. Es wird das Objekt, das als Argument empfangen wurde, dem zuweisen__proto__
Eigenschaft des neu erstellten Objekts . Auch hier ist es wichtig zu erkennen, dass wir an das prototypische Vererbungsparadigma gebunden sind, das JS verkörpert.Beispiel:
quelle
Sie können nicht von einer Klasse in JavaScript erben, da es in JavaScript keine Klassen gibt.
quelle