Джастін Фаньяні описує дуже чистий (імхо) спосіб складання декількох класів в один, використовуючи той факт, що в ES2015 класи можуть створюватися з виразами класів .
Вирази проти декларацій
В основному, так само, як ви можете створити функцію з виразом:
function myFunction() {} // function declaration
var myFunction = function(){} // function expression
ви можете зробити те ж саме з класами:
class MyClass {} // class declaration
var MyClass = class {} // class expression
Вираз оцінюється під час виконання, коли виконується код, тоді як декларація виконується заздалегідь.
Використання виразів класів для створення міксин
Ви можете використовувати це для створення функції, яка динамічно створює клас лише тоді, коли функція викликається:
function createClassExtending(superclass) {
return class AwesomeClass extends superclass {
// you class body here as usual
}
}
Класна річ у тому, що ви можете заздалегідь визначити весь клас і вирішити лише, на який клас він повинен поширюватися на час виклику функції:
class A {}
class B {}
var ExtendingA = createClassExtending(A)
var ExtendingB = createClassExtending(B)
Якщо ви хочете змішати кілька класів разом, оскільки класи ES6 підтримують лише одне успадкування, вам потрібно створити ланцюжок класів, який містить усі класи, які ви хочете змішати разом. Отже, скажімо, що ви хочете створити клас C, який розширює і A, і B, ви можете це зробити:
class A {}
class B extends A {}
class C extends B {} // C extends both A and B
Проблема в тому, що це дуже статично. Якщо ви згодом вирішите, що хочете скласти клас D, який розширює B, але не A, у вас є проблеми.
Але за допомогою розумного хитрості, використовуючи той факт, що класи можуть бути виразами, ви можете вирішити це, створивши A і B не безпосередньо як класи, а як фабрики класів (використовуючи функції стрілок для стислості):
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)
Зверніть увагу, як ми лише в останній момент вирішуємо, які класи включати до ієрархії.