如何在匿名函数中为 javascript class 声明静态常量数组?

How to declare static, constant arrays for a javascript class inside anonymous function?

我正在编写一个 JS 脚本来渲染吉他指板。我需要在 class 中声明两个静态变量。一个对象将 "C#" 之类的音符名称映射到它们的整数 MIDI 音符上,另一个对象数组为每个 midi 节点提供详细信息。看起来我必须在 class/function 本身之后声明这些,但我想确保我可以在构造函数中引用它们。

使问题复杂化的是,我想在匿名函数中为我的代码命名空间以防止名称冲突——我知道这些是最佳做法。

我一直在研究一些代码并得到了类似的东西,但我认为最后的东西不会起作用。

(function(){

    // object to encapsulate this module
    var MyClass = function() {
        this.foo = "foo";
        this.bar = "bar";
    };

    MyClass.nameToMidiNumber = {"C0":0,"C#0":1,"Db0":1,"D0":2,"D#0":3,"Eb0":3}; // and so on

    MyClass.midiData = [{"octave":0,"utf8_name":"C","ascii_name":"C","frequency":8.1757989156},{"octave":0,"utf8_name":"C♯\/D♭","ascii_name":"C#\/Db","frequency":8.661957218}]; // etc



    if(typeof window!="undefined"){
        window.MYNAMESPACE || (window.MYNAMESPACE = {});
        if(window.MYNAMESPACE.MyClass){
            for(var prop in MyClass){
                window.MYNAMESPACE.MyClass[prop]=MyClass[prop]
            }
        }else{
            window.MYNAMESPACE.MyClass=MyClass
        }
    } else {
        throw "'window' not defined. Unable to attach MyClass.";
    }
})();

我这样做对吗?理想情况下,在使用 HTML 标记包含此脚本后:

<script type="text/javascript" src="myscript.js"></script>

然后我可以像这样实例化对象:

var gtr = new MYNAMESPACE.MyClass(prm1, prm2, prm3);

我也知道目前正在过渡到具有 class and static keywords 的 ES6。我应该改用它吗?

如果您不必支持 IE9,请随意使用 ES6 和 类。否则,您将不得不使用 babel 从 ES6 转换为 ES5——"nonsense," 正如您所说的那样。

Window 通常在浏览器 window 中随时可用 运行 javascript,所以我认为您不必检查是否window 是否定义。这里有一些信息:

Is window.document ever null or undefined?

我认为您用来遍历对象中的键的代码是可以的。 ES6 有更简洁的方式来做类似的事情,值得一看。

最后,是的,您可以为 类 使用 ES6 功能,或者 NEW 关键字也可以。一种是经典的,一种是原型的,纯粹主义者可能更喜欢坚持后者,尽管年龄较大。