Justin Fagnani menjelaskan cara yang sangat bersih (imho) untuk menyusun beberapa kelas menjadi satu menggunakan fakta bahwa dalam ES2015, kelas dapat dibuat dengan ekspresi kelas .
Ekspresi vs deklarasi
Pada dasarnya, sama seperti Anda dapat membuat fungsi dengan ekspresi:
function myFunction() {} // function declaration
var myFunction = function(){} // function expression
Anda dapat melakukan hal yang sama dengan kelas:
class MyClass {} // class declaration
var MyClass = class {} // class expression
Ekspresi dievaluasi saat runtime, ketika kode dijalankan, sedangkan deklarasi dieksekusi sebelumnya.
Menggunakan ekspresi kelas untuk membuat mixin
Anda bisa menggunakan ini untuk membuat fungsi yang secara dinamis membuat kelas hanya ketika fungsi dipanggil:
function createClassExtending(superclass) {
return class AwesomeClass extends superclass {
// you class body here as usual
}
}
Hal yang paling keren tentang itu adalah Anda dapat mendefinisikan seluruh kelas sebelumnya dan hanya memutuskan kelas mana yang harus diperluas pada saat Anda memanggil fungsi:
class A {}
class B {}
var ExtendingA = createClassExtending(A)
var ExtendingB = createClassExtending(B)
Jika Anda ingin menggabungkan beberapa kelas bersama, karena kelas ES6 hanya mendukung pewarisan tunggal, Anda perlu membuat rantai kelas yang berisi semua kelas yang ingin Anda campur bersama. Jadi katakanlah Anda ingin membuat kelas C yang memanjang A dan B, Anda bisa melakukan ini:
class A {}
class B extends A {}
class C extends B {} // C extends both A and B
Masalahnya adalah ini sangat statis. Jika nanti Anda memutuskan ingin membuat kelas D yang memanjang B tetapi tidak A, Anda punya masalah.
Tetapi dengan beberapa tipuan cerdas menggunakan fakta bahwa kelas dapat menjadi ekspresi, Anda dapat menyelesaikan ini dengan membuat A dan B tidak secara langsung sebagai kelas, tetapi sebagai pabrik kelas (menggunakan fungsi panah untuk singkatnya):
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)
Perhatikan bagaimana kita hanya memutuskan pada saat terakhir kelas mana yang termasuk dalam hierarki.