Justin Fagnani mô tả một cách rất rõ ràng (imho) để kết hợp nhiều lớp thành một bằng cách sử dụng thực tế là trong ES2015, các lớp có thể được tạo bằng các biểu thức lớp .
Biểu thức so với khai báo
Về cơ bản, giống như bạn có thể tạo một hàm với một biểu thức:
function myFunction() {} // function declaration
var myFunction = function(){} // function expression
bạn có thể làm tương tự với các lớp:
class MyClass {} // class declaration
var MyClass = class {} // class expression
Biểu thức được ước tính trong thời gian chạy, khi mã thực thi, trong khi khai báo được thực thi trước.
Sử dụng biểu thức lớp để tạo mixins
Bạn có thể sử dụng điều này để tạo một hàm chỉ tạo một lớp động khi hàm được gọi:
function createClassExtending(superclass) {
return class AwesomeClass extends superclass {
// you class body here as usual
}
}
Điều thú vị ở đây là bạn có thể định nghĩa toàn bộ lớp trước và chỉ quyết định lớp nào sẽ kéo dài theo thời gian bạn gọi hàm:
class A {}
class B {}
var ExtendingA = createClassExtending(A)
var ExtendingB = createClassExtending(B)
Nếu bạn muốn trộn nhiều lớp với nhau, vì các lớp ES6 chỉ hỗ trợ kế thừa duy nhất, bạn cần tạo một chuỗi các lớp có chứa tất cả các lớp bạn muốn trộn với nhau. Vì vậy, giả sử bạn muốn tạo một lớp C mở rộng cả A và B, bạn có thể làm điều này:
class A {}
class B extends A {}
class C extends B {} // C extends both A and B
Vấn đề với điều này là nó rất tĩnh. Nếu sau này bạn quyết định muốn tạo một lớp D mở rộng B nhưng không phải A, bạn có vấn đề.
Nhưng với một số mánh khóe thông minh sử dụng thực tế là các lớp có thể là biểu thức, bạn có thể giải quyết điều này bằng cách tạo A và B không trực tiếp dưới dạng các lớp, mà là các nhà máy lớp (sử dụng các hàm mũi tên cho ngắn gọn):
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)
Lưu ý cách chúng ta chỉ quyết định vào thời điểm cuối cùng mà các lớp sẽ bao gồm trong hệ thống phân cấp.