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
。提供了进一步的示例。