Justin Fagnani describe una forma muy limpia (en mi humilde opinión) de componer varias clases en una utilizando el hecho de que en ES2015, las clases se pueden crear con expresiones de clase .
Expresiones vs declaraciones
Básicamente, al igual que puedes crear una función con una expresión:
function myFunction() {} // function declaration
var myFunction = function(){} // function expression
Puedes hacer lo mismo con las clases:
class MyClass {} // class declaration
var MyClass = class {} // class expression
La expresión se evalúa en tiempo de ejecución, cuando se ejecuta el código, mientras que una declaración se ejecuta de antemano.
Usando expresiones de clase para crear mixins
Puede usar esto para crear una función que crea dinámicamente una clase solo cuando se llama a la función:
function createClassExtending(superclass) {
return class AwesomeClass extends superclass {
// you class body here as usual
}
}
Lo bueno de esto es que puedes definir toda la clase de antemano y solo decidir en qué clase se extenderá para cuando llames a la función:
class A {}
class B {}
var ExtendingA = createClassExtending(A)
var ExtendingB = createClassExtending(B)
Si desea mezclar varias clases, ya que las clases de ES6 solo admiten herencia única, debe crear una cadena de clases que contenga todas las clases que desea mezclar. Entonces, digamos que desea crear una clase C que extienda tanto A como B, puede hacer esto:
class A {}
class B extends A {}
class C extends B {} // C extends both A and B
El problema con esto es que es muy estático. Si luego decide que desea crear una clase D que se extienda B pero no A, tiene un problema.
Pero con algunos trucos inteligentes que usan el hecho de que las clases pueden ser expresiones, puede resolver esto creando A y B no directamente como clases, sino como fábricas de clases (usando brevemente las funciones de flecha):
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)
Observe cómo solo decidimos en el último momento qué clases incluir en la jerarquía.