Justin Fagnani อธิบายวิธีที่สะอาดมาก (imho) ในการเขียนหลายชั้นเรียนให้เป็นหนึ่งเดียวโดยใช้ข้อเท็จจริงที่ว่าใน 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)
สังเกตว่าเราตัดสินใจเฉพาะในช่วงสุดท้ายว่าจะรวมคลาสใดไว้ในลำดับชั้น