2017-06-09 44 views
22

Tôi đang xây dựng lại một dự án Java cũ trong Javascript, và nhận ra rằng không có cách nào tốt để làm enums trong JS.Enums trong Javascript với ES6

Điều tốt nhất tôi có thể đưa ra là:

const Colors = { 
    RED: Symbol("red"), 
    BLUE: Symbol("blue"), 
    GREEN: Symbol("green") 
}; 
Object.freeze(Colors); 

Các const giữ Colors khỏi bị bố trí, và đóng băng nó ngăn chặn biến đổi các phím và các giá trị. Tôi đang sử dụng Biểu tượng để Colors.RED không bằng 0 hoặc bất kỳ thứ gì khác ngoài chính nó.

Có vấn đề với công thức này không? Có cách nào tốt hơn?


(Tôi biết câu hỏi này là một chút của một lặp lại, nhưng tất cả các previous Q/As khá cũ, và ES6 cho chúng ta một số tính năng mới.)

+2

đây sẽ là một cách tiếp cận hoàn hảo trong es6. Bạn không phải đóng băng nó – Nirus

+2

@Nirus bạn làm, nếu bạn không muốn nó được sửa đổi. – zerkms

+1

Bạn có nhận thấy [câu trả lời này] (https://stackoverflow.com/a/30058506/1048572) không? – Bergi

Trả lời

27

Có một vấn đề với công thức này?

Tôi không thấy gì cả.

Có cách nào tốt hơn không?

Tôi muốn sụp đổ hai câu thành một:

const Colors = Object.freeze({ 
    RED: Symbol("red"), 
    BLUE: Symbol("blue"), 
    GREEN: Symbol("green") 
}); 

Nếu bạn không thích những soạn sẵn, giống như lặp đi lặp lại Symbol cuộc gọi, bạn có thể dĩ nhiên cũng viết một hàm helper makeEnum tạo điều tương tự từ danh sách tên.

+2

Không có vấn đề gì ở đây? –

+0

@torazaburo Bạn có nghĩa là, khi mã được nạp hai lần nó sẽ tạo ra các biểu tượng khác nhau, đó sẽ không phải là một vấn đề với chuỗi? Vâng, điểm tốt, làm cho nó một câu trả lời :-) – Bergi

+0

Tôi đoán bạn có thể lưu trữ các biểu tượng ở đâu đó, và sau đó gán chúng khi bạn khởi tạo Enum. Có cách nào khác để làm cho chúng độc đáo không? ('Symbol.for' sẽ có cùng một vấn đề.) –

0

Đồng thời kiểm tra Enumify, thư viện rất tốt và nổi bật với ES6 enums.

Hy vọng điều này sẽ giúp ai đó.

Trân trọng,

Emmanuel