Mixins für ES6-Klassen, mit Babel transpiliert

8

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%
gotofritz 09.06.2015, 12:37
quelle

3 Antworten

13

Es gibt zwei Probleme mit deinen Mixins:

  1. Object.assign kopiert nur aufzählbare Eigenschaften eines Objekts. Die Methoden und Eigenschaften einer Klasse sind jedoch nicht aufzählbar.
  2. Die Methoden und Eigenschaften einer Klasse sind im Konstruktor nicht definiert. Sie sind auf dem Prototyp des Konstruktors definiert.

So würden Sie eine Klasse mit Mixins erweitern:

%Vor%

Es funktioniert wie erwartet in Babel: Demo .

    
Aadit M Shah 09.06.2015, 13:10
quelle
13

Subclass Factory Mixins

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:

%Vor%

Was sind die Vorteile von Mixins bei Sublcass-Fabriken?

  • Vorrang für natürliche Eigenschaften: Spätere Eigenschaften, die zuvor überschrieben wurden, überschreiben frühere Eigenschaften desselben Namens
  • Beide Mixins ( Human / Simpson ) und Unterklassen ( Homer ) können super wie gewohnt verwenden
  • Mixins können Konstruktoren (Stateful Mixins) haben
  • keine Mutation von Prototypen oder Instanzen

Stateful Mixins

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:

%Vor%

* Der Begriff First-Class-Funktionen bedeutet, dass Funktionen als Argumente übergeben werden können oder Rückgabewerte wie normale Daten

    
ftor 09.08.2016 12:33
quelle
0

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

Anwendbare Objekte / Typen

  • die ihre Syntax nicht mit der von Klassen
  • kombinieren
  • weil sie ausschließlich auf Objekt / Instanz-Ebene arbeiten sollen, also auch von (Konstruktor) innerhalb von (Klassen-) Konstruktoren und von innerhalb (Funktions-) Körpern anderer anwendbarer Typen, ...
  • ist also nur containers der beiden Regeln für die Eigenschafts- und Objektzusammensetzung , die ausschließlich bei der Dauer eines solchen Traits / ApplicableType ausgeführt werden.

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.

%Vor% %Vor% %Vor%

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 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.

    
Peter Seliger 30.03.2017 23:26
quelle