具有枚举值作为参数

时间:2015-06-15 16:51:17

标签: javascript constructor module prototype enumeration

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

到目前为止我所拥有的解决方案依赖于两个独立的功能:一个使用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上的原型方法以某种方式使枚举值可用,但问题是该方法不存在"直到对象被实例化。

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

感谢任何帮助。

编辑:有人指出这里不需要揭示模块模式,我理解并同意这一点。这是早期尝试解决这个问题的一个退化结构。此时,我不知道是否更喜欢编辑RM模式(因为它与问题无关)或者此编辑是否足够。我更喜欢隐藏自己的耻辱,但我也有一个错误...

2 个答案:

答案 0 :(得分:3)

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

function Painter(color) {

}

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

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

在定义枚举时不需要显示模式,因为无论如何你都暴露了所有内容。

答案 1 :(得分:0)

如果您希望将所有这些内容封装在同一个对象中,您可以遵循一切都是对象

的方法
//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");