Max*_* M. 9 javascript enums class ecmascript-6 es6-class
我想问一下是否可以添加类似于以下内容的枚举:
STATES = {
WIP: "Work in progress",
ONLINE: "Online",
ONLINE_MODIFIED: "Online, modified",
HIDDEN: "Hidden"
}
Run Code Online (Sandbox Code Playgroud)
在一个类中,并且能够在其他类似于以下内容的文件中使用它:object.updateState(Class.STATES.HIDDEN)而不必构造像这样的新对象boxObject.updateState(new Box().STATES.HIDDEN)
谢谢.
小智 21
您可以通过多种方式实现静态数据属性:
使用作业:
const STATES = {
WIP: "Work in progress",
ONLINE: "Online",
ONLINE_MODIFIED: "Online, modified",
HIDDEN: "Hidden"
};
class Box {};
Box.STATES = STATES;
console.log(Box.STATES.WIP); // Work in progress is the output
Run Code Online (Sandbox Code Playgroud)
使用Object.defineProperty:
使用Object.defineProperty时,可以将其设置为只读
const STATES = {
WIP: "Work in progress",
ONLINE: "Online",
ONLINE_MODIFIED: "Online, modified",
HIDDEN: "Hidden"
};
class Box {};
Object.defineProperty(Box, 'STATES', {
value: STATES,
writable: false, // makes the property read-only
});
console.log(Box.STATES.WIP); // Work in progress is the output
Run Code Online (Sandbox Code Playgroud)
使用静态吸气剂:
您可以使用ES6静态getter语法在类定义中添加属性.您可以将其设置为只读,也只是定义getter.
const STATES = {
WIP: "Work in progress",
ONLINE: "Online",
ONLINE_MODIFIED: "Online, modified",
HIDDEN: "Hidden"
};
class Box {
static get STATES() {
return STATES;
}
}
console.log(Box.STATES.WIP); // Work in progress is the output
Run Code Online (Sandbox Code Playgroud)
所有这一切,我同意n00dl3.如果您使用的是ES6模块,则使用命名导出似乎更合适:
export const BOX_STATES = {
WIP: "Work in progress",
ONLINE: "Online",
ONLINE_MODIFIED: "Online, modified",
HIDDEN: "Hidden"
};
export default class Box {};
Run Code Online (Sandbox Code Playgroud)
所以你可以像这样导入它:
import { BOX_STATES } from './path-to-box';
console.log(BOX_STATES.WIP); // Work in progress is the output
Run Code Online (Sandbox Code Playgroud)
像这样 :
export class Foo{}
Foo.SomeStaticEnum={BAR:"bar"};
Run Code Online (Sandbox Code Playgroud)
但导出const似乎更合适......
export const FOO={BAR:"bar"};
Run Code Online (Sandbox Code Playgroud)