Javascript ES6 - 在外面使用的类中的枚举像静态枚举一样

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)


n00*_*dl3 9

像这样 :

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)