我正在制作一个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已经过了。我应该使用它吗?
答案 0 :(得分:1)
如果您不必支持IE9,请随意使用ES6和课程。否则,你将不得不使用babel从ES6转换到ES5 - &#34;废话,&#34;正如你雄辩地说的那样。
在您运行javascript时,通常可以在浏览器窗口中显示窗口,因此我不认为您必须检查窗口是否已定义。这里有一些信息:
Is window.document ever null or undefined?
我认为用于迭代对象中的键的代码是可以的。 ES6有更清洁的方式来做类似的事情,值得一看。
最后,是的,您可以为类使用ES6功能,或者也可以使用NEW关键字。一个是经典的,一个是原型的,纯粹主义者可能更喜欢坚持使用后者,尽管年龄较大。