在javascript中使用枚举实现对象的正确方法

时间:2017-10-15 07:35:30

标签: javascript enums

我曾经使用常见的OOP语言(如swift或java:

)创建具有type属性的类
struct ClassA {
    enum Type {
        case b, c, d
    }

    var type: Type
}

然后像

一样使用它
let a = ClassA(type: .b)

在es6中类似的结构将是:

const Type = {  
    a: 0,
    b: 1,
    c: 2,
}

class ClassA {
    constructor(type) {
        this.type = type
    }
}

从我的角度来看问题是:

  • 要构建ClassA对象,用户还必须导入Type
  • 类型似乎不是ClassA的一部分

我的代码可以用于Javascript吗?在Javascript中描述的问题是可以的吗?对此有没有更好的方法?

我试图解决的当前问题是下一步

我有几种类型的用户活动表示为对象。它们有许多相似之处,例如名称日期持续时间等,但必须根据其类型进行显示。

我的解决方案是为所有对象提供必要的字段及其类型。

2 个答案:

答案 0 :(得分:1)

  

在javascript中使用枚举实现对象的正确方法

没有正确的方法,因为没有什么能比得上JS中的枚举。您只能采取越来越多的努力来尽可能地模拟您所知道的行为。但是对我而言,你忽略了你正在开发的语言,只是为了保持你宝贵的小开发日常工作而不需要学习新的东西。 (这不是针对你个人的。我之前就已经看过了。)

我只是将Type作为常量包含在ClassA

class ClassA {
    constructor(type) {
        this.type = type
    }
}

Object.defineProperties(ClassA, {
    TYPE_A: { enumerable: true, value: 0},
    TYPE_B: { enumerable: true, value: 1},
    TYPE_C: { enumerable: true, value: 2},
});

let instance = new ClassA( ClassA.TYPE_A );

或者您可以在编译时查看Typescript枚举的内容。

  

而不是模拟枚举是否有更好的方法来解决我的问题中描述的问题?   

<小时/>   我有几种类型的用户活动表示为对象。它们有许多相似之处,如姓名,日期,持续时间等,但必须根据其类型进行显示。

     

我的解决方案是为所有对象提供必要的字段及其类型。

这里不能给你一个好的答案,因为这仍然太宽泛了。我不确定,“活动”听起来像行为,但是通过属性告诉我宁愿认为我们只是在讨论数据......以及它们是如何处理的。

我不确定我是否甚至为此实现了一个类,而不仅仅是使用普通对象文字/ json。为了使其更具可读性,请将类型转换为字符串。

答案 1 :(得分:1)

经典情况就是这样解决的:

class ClassA {
    constructor(type) {
        this.type = type;
    }
}
ClassA.TYPE_A = 0;
ClassA.TYPE_B = 1;
ClassA.TYPE_C = 2;

var instance = new ClassA(ClassA.TYPE_B);

如果你真的想要,可以使用Object#defineProperty定义固定的只读属性而不是普通属性。

ES3语法中的等效代码更短,更重要,恕我直言。

function ClassA(type) {
    this.type = type;
}
ClassA.TYPE_A = 0;
ClassA.TYPE_B = 1;
ClassA.TYPE_C = 2;

var instance = new ClassA(ClassA.TYPE_B);