Có cách nào để sử dụng ký hiệu ECMAScript6 class
để khai báo biến kiểu lớp tĩnh hoặc giá trị mặc định cho một biến mẫu không? Nếu không có class
những gì tôi có trong tâm trí sẽ được viết nhưBiến thành viên trong các lớp ES6
function MyClass(arg) { if(arg) this.arg = arg; }
MyClass.classVariable = 42;
MyClass.prototype.arg = "no arg specified";
Rõ ràng nhất ES6 giống như ký hiệu theo ý kiến của tôi sẽ là
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static let classVariable = 42;
let arg = "no arg specified";
}
Nhưng điều này không làm việc, kể từ khi theo the current spec draft sự chỉ các sản phẩm của ClassElement là các phương thức tĩnh và mẫu và dấu chấm phẩy. OK, người ta có thể sử dụng một cặp phương thức getter và setter để đạt được ngữ nghĩa tương tự với những gì tôi đã phác thảo, nhưng tôi đoán ở một hình phạt nghiêm trọng về hiệu năng và với cú pháp thực sự kì quái.
Có một số dự thảo đề xuất bao gồm các biến trong ký hiệu class
, theo cách này hay cách khác không? Nếu vậy, cú pháp được đề xuất là gì, nó được xuất bản ở đâu, nó được thảo luận ở đâu, thảo luận diễn ra như thế nào, và tình trạng hiện tại của vấn đề ở mặt trận đó là gì? Vì nó là viết tắt, câu hỏi này không thể được trả lời nếu không có điều như vậy đã được thảo luận trước đây, ở cấp độ nào, nhưng tôi xem xét rằng không.
Một chút nền tảng: Tôi hiện đang đùa với trình biên dịch đóng trình biên dịch nâng cao của Google, sử dụng ES6 làm đầu vào. Để làm việc đó, tôi cần một chỗ để đặt chú thích kiểu cho biến thành viên, và tôi đã sử dụng chúng bằng cách sử dụng cú pháp như /** @type {string} */ MyClass.prototype.arg;
là một ngữ nghĩa không có trong ECMAScript nhưng cung cấp thông tin kiểu cho trình biên dịch đóng cửa đẹp và dễ dàng. Tôi chưa tìm thấy một cách tương tự tốt đẹp để làm điều này với một cấu trúc class
. Nhưng nếu bạn quan tâm đến việc giải quyết khía cạnh này, đó sẽ là một bình luận. Câu hỏi trên là về các khai báo thành viên không chỉ là số không, vì vậy đó là câu trả lời ở đây.
Tôi nghĩ lớp 'Foo {get foo() {return 123}}' là càng gần vì nó được – kangax
Tôi nghĩ kỹ thuật của @ kangax là đặt cược tốt nhất cho bất kỳ thứ gì sẽ hoạt động như một lớp trừu tượng. Tôi gặp vấn đề tương tự; đây là một bộ điều khiển tôi viết có thể/có thể không cung cấp cho bạn một số ý tưởng. Hàm khởi tạo của lớp cơ sở thực hiện tất cả việc nâng hạng nặng cho chức năng duy nhất (trong trường hợp này là mảng hợp nhất), vì vậy bạn phải đảm bảo rằng 'super()' luôn được gọi trên các hàm tạo lớp con: https://github.com/ affirmix/tungstenjs/blob/master/src/controller.js. Bạn có thể thấy rằng các lớp con không kết thúc quá khó chịu: https://github.com/affirmix/tungstenjs-todomvc/blob/master/src/todoitem-controller.j –