【问题标题】:How to declare static, constant arrays for a javascript class inside anonymous function?如何在匿名函数中为 javascript 类声明静态常量数组?
【发布时间】:2016-12-15 02:35:59
【问题描述】:

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

让事情变得复杂的是,我想在匿名函数中命名我的代码以防止名称冲突——我知道这些是最佳实践。

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

(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 过渡。我应该改用它吗?

【问题讨论】:

  • 不用担心将代码包装在匿名函数中。你最终在你的代码中得到了这些废话,现在它以某种方式被卡住了。您的模块不应该关心它如何被使用或安装到另一个库/框架中。让 browserify 或 babel 之类的打包工具来处理。只需编写一个普通的 ES6 模块,然后如果您仍然需要命名它,您可以在之后进行。
  • 我很高兴删除匿名函数(无论如何,一切都可能附加到 MYNAMESPACE,但我对编译或 babel 或 react 或任何其他关于这个项目的废话没有兴趣。很大程度上是因为they are so complicated.
  • @S.Imp 这不是废话。或者类似的东西

标签: javascript static ecmascript-6 ecmascript-5


【解决方案1】:

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

窗口通常应该在您运行 javascript 的任何时候在浏览器窗口中可用,所以我认为您不必检查窗口是否已定义。这里有一些信息:

Is window.document ever null or undefined?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2010-09-23
    • 2015-12-15
    相关资源
    最近更新 更多