如何在匿名函数中为 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 关键字也可以。一种是经典的,一种是原型的,纯粹主义者可能更喜欢坚持后者,尽管年龄较大。
我正在编写一个 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 关键字也可以。一种是经典的,一种是原型的,纯粹主义者可能更喜欢坚持后者,尽管年龄较大。