2016-12-15 35 views
-1

我正在製作一個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。我應該用它來代替嗎?

+0

不要擔心在匿名函數中包裝你的代碼。你最終得到這個廢話遍佈你的代碼,現在它仍然以某種方式工作。你的模塊不應該關心它如何被使用或掛載到另一個庫/框架中。讓一個像browserify或babel這樣的打包程序來處理這個問題。只需編寫一個普通的ES6模塊,然後如果您仍然需要命名空間,則可以在此之後執行此操作。 – naomik

+1

我很高興刪除匿名函數(無論如何,一切都可能附加到MYNAMESPACE上,但我對這個項目沒有興趣,或者對這個項目沒有任何其他廢話,很大程度上是因爲[它們太複雜了](https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f#.xxxqt56co)。 –

+1

@ S.Imp它不是不正確的。或者類似的東西 – Ringo

回答

1

如果您不必支持IE9,請隨意使用ES6和類。否則,你將不得不使用babel從ES6轉換到ES5--「胡說」,正如你雄辯地說的那樣。

在任何時候你正在運行JavaScript的瀏覽器窗口通常都可以使用窗口,所以我不認爲你必須檢查窗口是否被定義。有些信息在這裏:

Is window.document ever null or undefined?

我想你用鑰匙遍歷一個對象的代碼是OK。 ES6有很多更乾淨的方法來做類似的事情,值得一看。

最後,是的,您可以使用ES6功能類或NEW關鍵字工作。一個是古典的,一個是原型的,純粹主義者可能更喜歡堅持後者,儘管年齡較大。

相關問題