JavaScriptES6-类内部的枚举与静态枚举一样在外部使用

JavaScriptES6-类内部的枚举与静态枚举一样在外部使用,javascript,class,enums,ecmascript-6,es6-class,Javascript,Class,Enums,Ecmascript 6,Es6 Class,我想问一下,是否可以添加类似以下内容的枚举: STATES = { WIP: "Work in progress", ONLINE: "Online", ONLINE_MODIFIED: "Online, modified", HIDDEN: "Hidden" } 在一个类中,并能够在其他文件中使用它,类似于:object.updateState(Class.STATES.HIDDEN)而不必构造一个新对象,如boxObject.updateState(new

我想问一下,是否可以添加类似以下内容的枚举:

STATES = {
    WIP: "Work in progress",
    ONLINE: "Online",
    ONLINE_MODIFIED: "Online, modified",
    HIDDEN: "Hidden"
}
在一个类中,并能够在其他文件中使用它,类似于:
object.updateState(Class.STATES.HIDDEN)
而不必构造一个新对象,如
boxObject.updateState(new Box().STATES.HIDDEN)

谢谢。

像这样:

export class Foo{}
Foo.SomeStaticEnum={BAR:"bar"};
但导出常量似乎更合适

export const FOO={BAR:"bar"};

您可以通过多种方式实现静态数据属性:

使用分配

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
使用对象。定义属性

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
当您使用时,可以将其设置为只读

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
使用静态getter

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
可以使用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
尽管如此,我还是同意。如果您使用的是ES6模块,那么使用命名导出似乎更合适:

export const BOX_STATES = {
  WIP: "Work in progress",
  ONLINE: "Online",
  ONLINE_MODIFIED: "Online, modified",
  HIDDEN: "Hidden"
};

export default class Box {};
因此,您可以这样导入它:

import { BOX_STATES } from './path-to-box';

console.log(BOX_STATES.WIP); // Work in progress is the output

另一种不需要上课的简单方法

const BOX_STATES = {
  WIP: "Work in progress",
  ONLINE: "Online",
  ONLINE_MODIFIED: "Online, modified",
  HIDDEN: "Hidden"
};

module.exports = BOX_STATES;

console.log(BOX_STATES.WIP);

确保导入或需要文件,如上所示。

如果您不需要纯ES6并且可以使用Typescript,请选择它。Typescript有一个很好的导出选项

示例:

export enum STATES
{
        WIP = "Work in progress",
        ONLINE = "Online",
        ONLINE_MODIFIED = "Online, modified",
        HIDDEN = "Hidden"
}

export class SocialMedia
{
    static state: STATES = STATES.HIDDEN;
}


console.log(SocialMedia.state);
SocialMedia.state = STATES.WIP;
console.log(SocialMedia.state);
Hidden
Work in progress
结果:

export enum STATES
{
        WIP = "Work in progress",
        ONLINE = "Online",
        ONLINE_MODIFIED = "Online, modified",
        HIDDEN = "Hidden"
}

export class SocialMedia
{
    static state: STATES = STATES.HIDDEN;
}


console.log(SocialMedia.state);
SocialMedia.state = STATES.WIP;
console.log(SocialMedia.state);
Hidden
Work in progress

这是可能的,但你为什么要这么做?我将使用
export const STATES={…}取而代之。然后你可以将它导入到其他文件中需要的地方。很抱歉迟到了。问题发布几分钟后,你就差不多解决了问题。因此,尽管下一个人给出了更详细的答案,你还是得到了复选标记。为什么单独导出更好?@h3dkandi因为声明一个空类只是为了导出一个静态属性似乎有些过分:你只声明了两件事,而只使用了一件事。如果枚举仅与类一起使用会怎么样?假设我有一个班级啤酒,我有一个enum Beer.StandardBeers,你可以用它,比如说这个新啤酒(Beer.StandardBeers)或其他什么。这是一个很大的话题,但是,最好不要让它出现在你的课堂上,因为如果它是你的班级的一部分,无论你使用与否,它都会被导入(
import{myClass}from“x/y”
)。如果将它分开(
import{myClass}与“x/y”
import{myEnum}与“x/y”
)并单独导入,如果启用树抖动,则只能绑定类或枚举,这将使您在绑定大小中获得几个字节。不过,常量可能会产生误导。仍然可以执行BOX_STATES.WIP='Wewy important pewson',而不会出现错误,并更改“常量”的值。上面第三个示例中的静态getter必须由类或类构造函数访问,而不是由类实例访问。要从实例获取类,请使用构造函数:
Box.constructor.STATES.WIP
。提供了进一步的示例。