【问题标题】:Correct way to implement object with enum in javascript在javascript中使用枚举实现对象的正确方法
【发布时间】:2017-10-15 07:35:30
【问题描述】:

我曾经用常用的 OOP 语言(如 swift 或 java)创建具有类型属性的类:

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 中可以吗?有没有更好的方法呢?

我要解决的当前问题是下一个

我有几种类型的用户活动表示为对象。它们有很多相似之处,例如 namedateduration 等,但必须根据它们的类型显示。

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

【问题讨论】:

  • 您可以将Type 设为ClassA 的属性,但这并没有更好。
  • @Ryan,确切地说,也考虑过这一点
  • 但在这种情况下,object-enum 将至少是 ClassA 的一部分
  • 不要让 ES6 class 语法欺骗了你。这是语法糖。 Javascript 中没有类。从来没有,以后也不会。
  • 不要试图模仿其他语言的特定行为,而是解释你想要解决的问题。

标签: javascript enums


【解决方案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。为了使其更具可读性,请将类型转换为字符串。

【讨论】:

  • 似乎是解决我的问题的好方法
  • 感谢您的澄清。还有一个问题 - 除了模拟枚举之外,有没有更好的方法来解决我的问题中描述的问题?
  • @VladHatko 我也更新了我的答案来解决这个问题。
【解决方案2】:

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多