Justin Fagnani beschreibt einen sehr sauberen (imho) Weg , um mehrere Klassen in einem mit der Tatsache zu komponieren , dass in ES2015 können Klassen mit Klasse erstellt werden Ausdrücke .
Ausdrücke gegen Erklärungen
Grundsätzlich können Sie eine Funktion mit einem Ausdruck erstellen:
function myFunction() {} // function declaration
var myFunction = function(){} // function expression
Sie können dasselbe mit Klassen tun:
class MyClass {} // class declaration
var MyClass = class {} // class expression
Der Ausdruck wird zur Laufzeit ausgewertet, wenn der Code ausgeführt wird, während zuvor eine Deklaration ausgeführt wird.
Verwenden von Klassenausdrücken zum Erstellen von Mixins
Mit dieser Option können Sie eine Funktion erstellen, die nur dann dynamisch eine Klasse erstellt, wenn die Funktion aufgerufen wird:
function createClassExtending(superclass) {
return class AwesomeClass extends superclass {
// you class body here as usual
}
}
Das Coole daran ist, dass Sie die gesamte Klasse im Voraus definieren und nur entscheiden können, welche Klasse bis zum Aufruf der Funktion erweitert werden soll:
class A {}
class B {}
var ExtendingA = createClassExtending(A)
var ExtendingB = createClassExtending(B)
Wenn Sie mehrere Klassen miteinander mischen möchten, da ES6-Klassen nur eine einzige Vererbung unterstützen, müssen Sie eine Klassenkette erstellen, die alle Klassen enthält, die Sie zusammen mischen möchten. Angenommen, Sie möchten eine Klasse C erstellen, die sowohl A als auch B erweitert. Sie können dies tun:
class A {}
class B extends A {}
class C extends B {} // C extends both A and B
Das Problem dabei ist, dass es sehr statisch ist. Wenn Sie später entscheiden, dass Sie eine Klasse D erstellen möchten, die B, aber nicht A erweitert, haben Sie ein Problem.
Mit einigen cleveren Tricks, bei denen Klassen Ausdrücke sein können, können Sie dies lösen, indem Sie A und B nicht direkt als Klassen, sondern als Klassenfabriken erstellen (der Kürze halber mit Pfeilfunktionen):
class Base {} // some base class to keep the arrow functions simple
var A = (superclass) => class A extends superclass
var B = (superclass) => class B extends superclass
var C = B(A(Base))
var D = B(Base)
Beachten Sie, dass wir erst im letzten Moment entscheiden, welche Klassen in die Hierarchie aufgenommen werden sollen.