2016-12-15 13 views
-1

私はギターのフレットボードをレンダリングするためにJSスクリプトを作成しています。私はクラスに2つの静的な変数を宣言する必要があります。 "C#"のような音符の名前を整数のMIDIノートにマッピングする1つのオブジェクト、もう1つはオブジェクトの配列で、各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とクラスを使用してください。そうでなければ、あなたはES6からES5に移り変わるためにバベルを使用する必要があります - あなたは雄弁に言えば「ナンセンス」です。

通常、ウィンドウはブラウザのウィンドウでjavascriptを実行しているときに使用できるはずなので、ウィンドウが定義されているかどうかを確認する必要はありません。ここではいくつかの情報:

Is window.document ever null or undefined?

私は、あなたがオブジェクトにキーを反復処理するために使用するコードはOKだと思います。 ES6には、同様のことを行うためのよりクリーンな方法があり、見てみる価値があります。

最後に、はい、クラスにES6機能を使用することも、NEWキーワードも機能させることができます。 1つは古典的で、1つはプロトタイプであり、純粋主義者は年を取っているにもかかわらず、後者に固執することを好むかもしれません。

関連する問題