Justin Fagnani descrive un modo molto pulito (imho) di comporre più classi in una usando il fatto che in ES2015, le classi possono essere create con espressioni di classe .
Espressioni vs dichiarazioni
Fondamentalmente, proprio come puoi creare una funzione con un'espressione:
function myFunction() {} // function declaration
var myFunction = function(){} // function expression
puoi fare lo stesso con le classi:
class MyClass {} // class declaration
var MyClass = class {} // class expression
L'espressione viene valutata in fase di esecuzione, quando viene eseguito il codice, mentre una dichiarazione viene eseguita in anticipo.
Utilizzo delle espressioni di classe per creare mixin
Puoi usarlo per creare una funzione che crea dinamicamente una classe solo quando la funzione è chiamata:
function createClassExtending(superclass) {
return class AwesomeClass extends superclass {
// you class body here as usual
}
}
La cosa interessante è che puoi definire in anticipo l'intera classe e decidere solo su quale classe estendere al momento in cui chiami la funzione:
class A {}
class B {}
var ExtendingA = createClassExtending(A)
var ExtendingB = createClassExtending(B)
Se si desidera mescolare più classi insieme, poiché le classi ES6 supportano solo la singola eredità, è necessario creare una catena di classi che contenga tutte le classi che si desidera combinare. Quindi supponiamo che tu voglia creare una classe C che estende sia A che B, potresti farlo:
class A {}
class B extends A {}
class C extends B {} // C extends both A and B
Il problema è che è molto statico. Se in seguito decidi di voler creare una classe D che estende B ma non A, hai un problema.
Ma con qualche astuzia che utilizza il fatto che le classi possono essere espressioni, puoi risolverlo creando A e B non direttamente come classi, ma come fabbriche di classe (usando le funzioni freccia per brevità):
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)
Nota come decidiamo solo all'ultimo momento quali classi includere nella gerarchia.