2016-12-15 1 views
-1

JS 프래그먼트를 렌더링하기 위해 JS 스크립트로 작업하고 있습니다. 내 클래스에 두 개의 정적 변수를 선언해야합니다. "C#"과 같은 음표 이름을 정수 MIDI에 매핑하는 한 객체는 다른 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에 첨부되어있을 것입니다. 그러나이 프로젝트에 대해 transpiling이나 babel이나 반응이나 다른 말도 안되는 것에 관심이 없습니다.) ] (https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f#.xxxqt56co) –

+1

@ S.Imp 그것은 NONSENSE가 아닙니다. – Ringo

답변

1

IE9를 지원할 필요가없는 경우 ES6 및 클래스를 자유롭게 사용하십시오. 그렇지 않으면 ES6에서 ES5로 이동하기 위해 바벨 (바벨)을 사용해야합니다.

일반적으로 브라우저 창에서 자바 스크립트를 실행할 때 창을 사용할 수 있어야하므로 창을 정의했는지 여부를 확인하지 않아도됩니다. 여기에 몇 가지 정보 :

Is window.document ever null or undefined?

나는 당신이 개체의 키를 반복하는 데 사용하는 코드는 OK라고 생각합니다. ES6는 비슷한 일을하는 훨씬 더 깔끔한 방법을 가지고 있습니다.

마지막으로 예, 클래스에 ES6 기능을 사용할 수도 있고 NEW 키워드도 사용할 수 있습니다. 하나는 고전적이고 하나는 원형이며 순수 주의자는 나이가 들어도 후자와 고집하는 것을 선호 할 수 있습니다.