Ist es möglich, abstrakte Basisklassen in JavaScript zu simulieren? Was ist der eleganteste Weg, dies zu tun?
Sagen wir, ich möchte etwas tun wie: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
Es sollte ausgegeben werden: 'Rinde', 'Miau'
javascript
oop
abstract
Sabya
quelle
quelle
Antworten:
Eine einfache Möglichkeit, eine abstrakte Klasse zu erstellen, ist folgende:
Die
Animal
"Klasse" und diesay
Methode sind abstrakt.Das Erstellen einer Instanz würde einen Fehler auslösen:
So "erben" Sie davon:
Dog
sieht genauso aus.Und so spielt sich Ihr Szenario ab:
Fiddle hier (Blick auf die Konsolenausgabe).
quelle
JavaScript-Klassen und Vererbung (ES6)
Laut ES6 können Sie JavaScript-Klassen und Vererbung verwenden, um das zu erreichen, was Sie benötigen.
Referenz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
Zunächst definieren wir unsere abstrakte Klasse. Diese Klasse kann nicht instanziiert, sondern erweitert werden. Wir können auch Funktionen definieren, die in allen Klassen implementiert werden müssen, die diese erweitern.
Danach können wir unsere konkreten Klassen erstellen. Diese Klassen erben alle Funktionen und Verhaltensweisen von der abstrakten Klasse.
Und die Ergebnisse ...
quelle
Meinst du so etwas:
quelle
whattosay
ist nicht im Tier definiert ) und dass diese Antwort eindeutig fragt ob die vorgeschlagene Antwort das war, wonach der Fragesteller suchte. Es wird nicht behauptet, eine Lösung für abstrakte Klassen in Javascript anzugeben. Der Fragesteller hat sich nicht die Mühe gemacht, mir oder jemand anderem zu antworten, daher habe ich keine Ahnung, ob es für ihn funktioniert hat. Es tut mir leid, wenn eine fünf Jahre alte vorgeschlagene Antwort auf eine andere Frage für Sie nicht funktioniert hat.Vielleicht möchten Sie sich die Basisklasse von Dean Edwards ansehen: http://dean.edwards.name/weblog/2006/03/base/
Alternativ gibt es dieses Beispiel / diesen Artikel von Douglas Crockford zur klassischen Vererbung in JavaScript: http://www.crockford.com/javascript/inheritance.html
quelle
Bestimmt. Es gibt ungefähr tausend Möglichkeiten, Klassen- / Instanzsysteme in JavaScript zu implementieren. Hier ist eine:
Das ist natürlich keine abstrakte Basisklasse. Meinst du so etwas wie:
quelle
quelle
Dies funktioniert garantiert nicht als
__proto__
nicht als Standardvariable, funktioniert jedoch zumindest in Firefox und Safari.Wenn Sie nicht verstehen, wie es funktioniert, lesen Sie mehr über die Prototypenkette.
quelle
setPrototypeOf
Methode, die ich für meinen Code benötigen würde.Sie können abstrakte Klassen mithilfe von Objektprototypen erstellen. Ein einfaches Beispiel lautet wie folgt:
Sie können die obige Methode ändern oder nicht. Es liegt an Ihnen, wann Sie sie implementieren. Für eine detaillierte Beobachtung können Sie hier besuchen .
quelle
Die Frage ist ziemlich alt, aber ich habe eine mögliche Lösung erstellt, wie eine abstrakte "Klasse" erstellt und die Erstellung eines Objekts dieses Typs blockiert werden kann.
Wie Sie sehen können, gibt uns das letzte Objekt einen Fehler, weil das Tier im Prototyp die Eigenschaft hat
abstract
. Um sicher zu sein, dass es nicht Animal ist, wasAnimal.prototype
ich in der Prototypenkette habe:Ich überprüfe also, ob mein nächstgelegenes Prototypobjekt eine
abstract
Eigenschaft hat. Nur Objekte, die direkt aus demAnimal
Prototyp erstellt wurden, haben diese Bedingung auf true. Die FunktionhasOwnProperty
überprüft nur die Eigenschaften des aktuellen Objekts, nicht seine Prototypen. Dies gibt uns 100% ige Sicherheit, dass die Eigenschaft hier nicht in der Prototypenkette deklariert ist.In meinem Vorschlag müssen wir uns nicht
constructor
jedes Mal ändern,Object.create
wie es in der derzeit besten Antwort von @ Jordão ist.Die Lösung ermöglicht auch das Erstellen vieler abstrakter Klassen in Hierarchien. Wir müssen nur
abstract
Eigenschaften im Prototyp erstellen .quelle
Eine andere Sache, die Sie erzwingen möchten, ist sicherzustellen, dass Ihre abstrakte Klasse nicht instanziiert wird. Sie können dies tun, indem Sie eine Funktion definieren, die als FLAG-Funktion fungiert, die als Konstruktor für die abstrakte Klasse festgelegt ist. Dies wird dann versuchen, die FLAG zu konstruieren, die ihren Konstruktor mit der auszulösenden Ausnahme aufruft. Beispiel unten:
quelle
Javascript kann vererbt sein. Überprüfen Sie die folgende URL:
http://www.webreference.com/js/column79/
Andrew
quelle
Factory
In diesem Fall können wir ein Entwurfsmuster verwenden. Javascript wird verwendetprototype
, um die Mitglieder der Eltern zu erben.Definieren Sie den übergeordneten Klassenkonstruktor.
Und dann Kinderklasse erstellen.
Definieren Sie dann den untergeordneten Klassenkonstruktor.
Probier es aus.
Hier ist der Codepen-Link für die vollständige Beispielcodierung.
quelle
quelle
Ich denke, all diese Antworten, insbesondere die ersten beiden (von einigen und jordão ), beantworten die Frage klar mit dem konventionellen Prototyp-Basis-JS-Konzept.
Da Sie nun möchten, dass sich der Tierklassenkonstruktor gemäß dem an die Konstruktion übergebenen Parameter verhält, ist dies meiner Meinung nach dem Grundverhalten von
Creational Patterns
beispielsweise Factory Pattern sehr ähnlich .Hier habe ich einen kleinen Ansatz gemacht, damit es so funktioniert.
quelle
Animal
Konstruktor kann als Anti-Pattern angesehen werden. Eine Superklasse sollte keine Kenntnisse über Unterklassen haben. (verstößt gegen Liskov und Open / Close-Prinzip)quelle
Wenn Sie sicherstellen möchten, dass Ihre Basisklassen und ihre Mitglieder streng abstrakt sind, finden Sie hier eine Basisklasse, die dies für Sie erledigt:
Der strikte Modus macht es unmöglich, den Aufrufer in der throwAbstract-Methode zu protokollieren, aber der Fehler sollte in einer Debug-Umgebung auftreten, in der die Stapelverfolgung angezeigt wird.
quelle