Javascript 以枚举值作为参数的构造函数

Javascript constructor with enumeration value as argument

我想创建一个对象,它可以将一组固定的输入字符串中的一个作为构造函数中的参数。为了限制可能的字符串,我想使用枚举类型的构造。

到目前为止,我的解决方案依赖于两个独立的函数:一个使用 Revealing Module 模式(我认为)来公开固定的字符串集,如下所示:

var MyEnum = (function() {
    var stringA = "string A";
    var stringB = "string B";
    var stringC = "string C";

    return {
        stringA: stringA,
        stringB: stringB,
        stringC: stringC
    };
})();

第二个函数将字符串值之一(连同其他值)作为输入作为构造参数。例如,给定一个名为 MyObject 的函数,我是这样称呼它的:

var myInstance = new MyObject(MyEnum.stringB, 42, "blue");

我想知道的是:是否有将 MyEnum 和 MyObject 合并为一个实体的替代架构? MyEnum 没有被其他任何东西使用,但这是我能找到的让字符串实例可用于 MyObject 构造函数的唯一方法。

我尝试以某种方式通过 MyObject 上的原型方法使枚举值可用,但问题是该方法 "exist" 直到对象被实例化。

对于背景,我来自 C# 的土地,所以我知道我的想法偏向于那个方向,也许解决方案更多的是心理上的而不是技术上的。

感谢任何帮助。

编辑: 有人指出这里不需要显示模块模式,我理解并同意。这是早期解决此问题的尝试中留下的残余结构。在这一点上,我不知道编辑 RM 模式是否更好(因为它与问题无关)或者这种编辑是否足够。我宁愿隐藏自己的耻辱,但我也可以承认错误...

您可以将 static 属性附加到函数对象:

function Painter(color) {

}

Painter.Color = {
    RED: "color_red",
    BLUE: "color_blue"
};

var painter = new Painter(Painter.Color.BLUE);

定义枚举时不需要显示模式,因为无论如何您都会公开所有内容。

如果你想把所有这些东西都封装在同一个对象中,你可以遵循这种方法一切都是一个对象

//constructor definition
function Contructor(arg1, arg2) {
  //use Contructor.values
  //implementation
}

//defines the set of values as a property of the constructor
Contructor.values = {
  stringA: "string A",
  stringB: "string B",
  stringC: "string C"
};

或者,如果您想将其作为参数传递:

//constructor definition
function Contructor(value, arg1, arg2) {
  //implementation
}

var obj = new Contructor(Contructor.values.stringA, 42, "blue");