我正在製作一個JS腳本來渲染吉他指板。我需要在我的班級申報兩個靜態變量。一個將諸如「C#」之類的音符名稱映射到它們的整數MIDI音符上的對象,另一個對象提供每個MIDI音符細節的對象數組。它看起來像我必須在類/函數本身後面聲明這些,但我想確保我可以在構造函數中引用它們。如何聲明匿名函數內的JavaScript類的靜態常量數組?
複雜的事情是,我想我的代碼在匿名函數內部命名空間,以防止名稱衝突 - 我明白這些都是最佳實踐。
我一直在搗鼓一些代碼,並有類似的東西,但我不認爲最後的東西會起作用。
(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。我應該用它來代替嗎?
不要擔心在匿名函數中包裝你的代碼。你最終得到這個廢話遍佈你的代碼,現在它仍然以某種方式工作。你的模塊不應該關心它如何被使用或掛載到另一個庫/框架中。讓一個像browserify或babel這樣的打包程序來處理這個問題。只需編寫一個普通的ES6模塊,然後如果您仍然需要命名空間,則可以在此之後執行此操作。 – naomik
我很高興刪除匿名函數(無論如何,一切都可能附加到MYNAMESPACE上,但我對這個項目沒有興趣,或者對這個項目沒有任何其他廢話,很大程度上是因爲[它們太複雜了](https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f#.xxxqt56co)。 –
@ S.Imp它不是不正確的。或者類似的東西 – Ringo