Nach verschiedenen Quellen ( 2ality , esdiscuss ) sollte man Mixins zu Klassen hinzufügen können:
EDIT hat festgestellt, dass Klassenmethoden nicht aufzählbar sind, sodass sie nicht funktionieren können. Bearbeitete den Code unten, aber immer noch keine Freude
%Vor%Ich bekomme das "von Matt Groening gezogen", aber anstelle des "Biertrinkens" bekomme ich einen Fehler
%Vor%Es gibt zwei Probleme mit deinen Mixins:
Object.assign
kopiert nur aufzählbare Eigenschaften eines Objekts. Die Methoden und Eigenschaften einer Klasse sind jedoch nicht aufzählbar. So würden Sie eine Klasse mit Mixins erweitern:
%Vor%Es funktioniert wie erwartet in Babel: Demo .
Es gibt eine andere Möglichkeit, Mixins in Javascript zu realisieren: Mit Unterklassenfabriken.
Eine Unterklassenfactory ist eine Funktion, die eine Basisklasse ausschließt und eine erweiterte Unterklasse dieser Basisklasse zurückgibt:
%Vor%Unterklassenfabriken sind aus zwei Gründen möglich:
class
es kann als Ausdruck definiert werden und sind erste Klasse * in Javascript extends
-Klauseln können beliebige Ausdrücke enthalten Wenden wir dieses Muster an:
Was sind die Vorteile von Mixins bei Sublcass-Fabriken?
Human
/ Simpson
) und Unterklassen ( Homer
) können super
wie gewohnt verwenden Staat macht die Dinge schwer. Sie sollten den Status möglichst vermeiden. Manchmal benötigt Ihr Mixin jedoch einen eigenen Status, der durch einen Konstruktor übergeben wird:
* Der Begriff First-Class-Funktionen bedeutet, dass Funktionen als Argumente übergeben werden können oder Rückgabewerte wie normale Daten
Wie schon zuvor von @mfeineis, @aadit-m-shah und @gotofritz diskutiert und mit dem neuesten Post von @ftor gezeigt wurde, muss man immer genau überlegen, welche Klasse zu cripple Um ein solches Konzept in der Praxis zu beweisen, habe ich alle obigen Beispiele in die Zusammensetzung von Merkmal aus Merkmal und in Objekt Komposition aus Merkmalen innerhalb von Klassenkonstruktoren umgestaltet . Ich möchte über einen solchen Ansatz, seine Vorteile und seine Unzulänglichkeiten im Vergleich zu allen bereits heute akzeptierten Techniken diskutieren. Zum Sichern des obigen Beispiels gibt es einen weiteren Thread - Refactoring Legacy-Mixin-basierte Klassenhierarchien - wo ich auch die Chance nutzte, das Beispiel des OP zu refaktorisieren. Dieser enthält Anwendbare Objekte / Typen
ApplicableType
ausgeführt werden. after
und around
Modifikation von auf einfachem Objekt basierendes Verhalten. Derselbe Ansatz / das gleiche Toolset, das hier verwendet wurde, erfüllte alle Anforderungen des OP. Man kann jetzt mit Klassen arbeiten, bekommt verkapselte Zustände / Daten kostenlos und hat auch stützende Unterstützung für jede Art von Methodenmodifikation.
Tags und Links javascript traits ecmascript-6 mixins composition