如何为匿名函数中的javascript类声明静态,常量数组?

时间:2016-12-15 02:35:59

标签: javascript static ecmascript-6 ecmascript-5

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

使问题复杂化的是我想在匿名函数中命名我的代码以防止名称冲突 - 我理解这些是最佳实践。

我一直在使用一些代码,并且有类似的东西,但我认为最终的东西不会起作用。

(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);

我也知道目前正在向ES6进行过渡,其中class and static keywords已经过了。我应该使用它吗?

1 个答案:

答案 0 :(得分:1)

如果您不必支持IE9,请随意使用ES6和课程。否则,你将不得不使用babel从ES6转换到ES5 - &#34;废话,&#34;正如你雄辩地说的那样。

在您运行javascript时,通常可以在浏览器窗口中显示窗口,因此我不认为您必须检查窗口是否已定义。这里有一些信息:

Is window.document ever null or undefined?

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

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