我曾经使用常见的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
}
}
从我的角度来看问题是:
我的代码可以用于Javascript吗?在Javascript中描述的问题是可以的吗?对此有没有更好的方法?
我试图解决的当前问题是下一步
我有几种类型的用户活动表示为对象。它们有许多相似之处,例如名称,日期,持续时间等,但必须根据其类型进行显示。
我的解决方案是为所有对象提供必要的字段及其类型。
答案 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);