首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用ES6实现Javascript中的枚举

用ES6实现Javascript中的枚举
EN

Stack Overflow用户
提问于 2017-06-09 09:19:15
回答 15查看 144.3K关注 0票数 177

我正在用Javascript重建一个旧的Java项目,并意识到在JS中没有好的方法来做枚举。

我能想到的最好的结果是:

代码语言:javascript
运行
复制
const Colors = {
    RED: Symbol("red"),
    BLUE: Symbol("blue"),
    GREEN: Symbol("green")
};
Object.freeze(Colors);

const防止Colors被重新赋值,冻结它可以防止键和值发生变化。我之所以使用符号,是因为Colors.RED不等于0,也不等于它本身以外的任何东西。

这个公式有问题吗?有没有更好的办法?

(我知道这个问题有点重复,但所有的都很旧,ES6给了我们一些新功能。)

编辑:

另一种解决方案,处理序列化问题,但我认为仍然存在领域问题:

代码语言:javascript
运行
复制
const enumValue = (name) => Object.freeze({toString: () => name});

const Colors = Object.freeze({
    RED: enumValue("Colors.RED"),
    BLUE: enumValue("Colors.BLUE"),
    GREEN: enumValue("Colors.GREEN")
});

通过使用对象引用作为值,您可以获得与符号相同的冲突避免。

EN

Stack Overflow用户

发布于 2021-05-09 15:50:36

我使用了这种方法,它模仿C#和Java中的枚举。请注意,EnumFunction的子类,因此枚举值是对象,您可以向枚举添加实例方法。

代码语言:javascript
运行
复制
function inherits(ctor, superCtor) {
    ctor.super_ = superCtor
    Object.setPrototypeOf(ctor.prototype, superCtor.prototype)
}

function Enum(...values) {
    // refer to `T` instead of `this`
    function T(id) {
        if(id >= values.length || id < 0) {
           throw new Error("invalid enum id");
        }

        this.id = id;
    }

   T.prototype.toString = function () { return values[this.id]; }
    
    
    Object.setPrototypeOf(T, Enum.prototype);
    T._values = values;
    for(var i = 0; i < values.length; i++) {  
       var enum_value = new T(i);
        T[i] = enum_value; //allows for reverse lookup
        T[values[i]] = enum_value;
    }
    
    return T;
}

Enum.prototype.get_values = function () {
    return this._values;
}


inherits(Enum, Function);

//Test
var Color = new Enum("RED", "GREEN", "BLUE");

//Color is an actual class, so you can add methods to it (but not new enum values).
Color.prototype.something = function () { return 100; }


console.log(Color.RED);
console.log(Color.RED instanceof Color);
console.log(Color.RED.something());
console.log(Color.get_values());

通过使用类实例作为值,您可以获得与符号相同的冲突避免。

票数 0
EN
查看全部 15 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44447847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档