【发布时间】: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