【问题标题】:Is this a viable implementation of enums in Javascript?这是 Javascript 中枚举的可行实现吗?
【发布时间】:2012-09-14 04:13:03
【问题描述】:

我对我正在处理的项目的常量值的快速枚举很感兴趣,但是如果您只想在一个地方存储几个不变的值,那么我在 StackOverflow 上找到的所有内容都过于复杂了你可以重复使用它们。他们还使用对象,这意味着您可以更改它们的值,或者您必须理解并使用可能未在浏览器中实现的“冻结”关键字。

在这里明显使用闭包是个坏主意吗?也许我使用它们太多了,但似乎它们在任何地方都能派上用场。尤其是这里。

var black = new Color3f(0, 0, 0);
var white = new Color3f(1, 1, 1);
var blue = new Color3f(0, 0, 1);

var Colors = {

    //insert basic stuff for Color3f objects here

    BLACK: function(){
        return black;
    },

    //and so on
};

【问题讨论】:

  • “可行的实施”是什么意思? JS 不像强类型语言那样支持枚举。但是,由于每个对象本身就是一个哈希表,因此您当然可以创建查找对象,但不能阻止某人修改所述查找对象。
  • 并不是一个真正的枚举,它意味着顺序,这只是一堆'常量' - stackoverflow.com/a/131286/1097
  • “可行”是指“与我在查看其他问题时看到的任何其他实现一样有用”。但是,如果我对枚举的理解是错误的,正如 Geoff 暗示的那样,那么这可以解释为什么其他答案比仅仅将值包装在闭包中更复杂。

标签: javascript enums closures enumerable


【解决方案1】:

对象不能在 JavaScript 中创建闭包,因为它们从不创建变量范围。

要使用闭包,你可以这样做。

var color = (function() {

    var color_map = {
        black: new Color3f(0, 0, 0),
        white: new Color3f(1, 1, 1),
        blue: new Color3f(0, 0, 1)
    };

    return function(c) { return color_map[c.toLowerCase()]; };
})();

然后调用color 函数来获取颜色。

color("black");

请注意,外部函数是立即调用的,而内部函数是分配给color 变量的函数。

此外,您可能希望将所有代码包装在另一个函数中以防止任何形式的修改。

(function() {
    var color = (function() {
        var color_map = {
            black: new Color3f(0, 0, 0),
            white: new Color3f(1, 1, 1),
            blue: new Color3f(0, 0, 1)
        };

        return function(c) { return color_map[c.toLowerCase()]; };
    })();

    // the rest of your code
    alert(color("black"));
})();

【讨论】:

    【解决方案2】:

    不需要额外的全局变量:

    var Colors = {
    
        //insert basic stuff for Color3f objects here
    
        BLACK: new Color3f(0, 0, 0),
    
        //and so on
    };
    

    【讨论】:

    • 那么任何人都可以这样做:Colors.BLACK = new Color3f(1, 1, 1); ... var someMaterial.color = Colors.BLACK;我们不担心我们的枚举是可变的吗?
    • @asdfStackExchange 任何人都可以这样做:var undefined = true; 但我们并没有真正编写黑客来防止它 - 这完全是关于成本/收益。
    • @asdfStackExchange 您已尽职尽责地将您的“枚举”放入“命名空间”(尽管Colors 可能不是一个好名字),这几乎是您能做的。
    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 2013-05-18
    • 2013-08-06
    • 1970-01-01
    • 2016-02-08
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多