私はギターのフレットボードをレンダリングするために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。私はそれを代わりに使うべきですか?
コードを匿名関数でラップすることは心配しないでください。あなたはあなたのコードの上にこのくそをつけてしまって、今や特定のやり方で働いています。あなたのモジュールは、それがどのように使用されるか、別のライブラリ/フレームワークにマウントされる方法に気を付けるべきではありません。 browserifyやbabelのようなバンドラーがそれを世話するようにしましょう。プレーンなES6モジュールを書くだけで、まだ名前空間にする必要がある場合は、後でそれを行うことができます。 – naomik
匿名機能を削除しても大丈夫です(すべてがMYNAMESPACEに添付されている可能性がありますが、私はこのプロジェクトのために蒸散やバベルや反応やその他のナンセンスに興味がありません) ](https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f#.xxxqt56co)。 –
@ S.Impそれは無論ではありません。 – Ringo