2011-09-22 2 views
7
내 스크립트 내 모든 사이트에 대한 하나 개의 .js 파일로 구성 유지하려는

내 jQuery 스크립트에 적합한 패턴입니까?

(function ($) { 

    //private variables 
    $.divref = $("#divReference"); 

    //Namespaces 
    window.MySite = {}; 
    window.MySite.Home = {}; 
    window.MySite.Contact = {}; 

    //Public function/method 
    window.MySite.Home.Init = function(params){ 
     alert("Init"); 

     MySite.Home.PrivateFunction(); 

     $.divref.click(function(){ 
      alert("click"); 
     }); 
    }; 

    //private function/method 
    MySite.Home.PrivateFunction = function(){ 
     alert("Private"); 
    }; 

})(jQuery); 

이 맞다 ... (지금은 엉망이) C#에서 네임 스페이스와 클래스 같은? 또는 더 좋은 방법이 있습니까? 저는 jQuery와 JScript에서 새로운 것 같습니다. 시간과 답변에 감사드립니다.

+6

개인 변수를 만드는 방법이 잘못되었습니다. 코드를 실행 한 후에 존재하는 $ 객체에 연결합니다. 당신은 그것에 대한 폐쇄를 원한다. –

+1

@ g.d.d.c 그게 좋은 답변을 만들 것입니다. – vhallac

답변

1

이 내가 당신이하려고하는 패턴 구현 얼마나 더 : 그래서 private 변수가 늘 네임 스페이스에 네임 스페이스에서 출혈,

// MySite.Home Extension 
window.MySite = 
    (function ($, root) { 

     //private variables 
     var $divref = $("#divReference"); 

     //private function/method 
     var privateFunction = function(){ 
      alert("Private"); 
     };   

     root.Home = {}; 

     // Public variable 
     root.Home.prop = "Click" 

     //Public function/method 
     root.Home.Init = function(params){ 
      alert("Init"); 

      private(); 

      $divref.click(function(){ 
       alert(root.Home.prop); 
      }); 
     }; 

     return root; 

    })(jQuery, window.MySite || {}); 

// MySite.Contact Extension 
window.MySite = 
    (function ($, root) { 

     root.Contact = {}; 

     // More stuff for contact 

     return root; 

    })(jQuery, window.MySite || {}); 

첫 번째 변화는 자신의 모듈 패턴에 각각 "네임 스페이스"를 분할됩니다 (당신이 네임 스페이스에 대해 사적인 것이라면 더 많은 C# esque가 될 것입니다). 두 번째는 window.MySite에 액세스하는 것이 아니라 확장하려는 객체를 전달하는 것입니다 (이 경우에는 root이라고 부릅니다). 이것은 당신에게 약간의 유연성을 줄 것입니다.

개인 방법은 실제 비공개가 아니 었습니다. private 메소드를 만들려면, 클로저에서 바인드했지만 외부에서 볼 수있는 객체의 속성에 할당되지 않은 var 함수를 만들고 싶을뿐입니다. 마지막으로 $.somegarbage을 사용하지 않으려 고합니다. 주석에서 언급 한 것처럼, $ 객체에 속성을 추가하는 중입니다. 객체가 닫히면 여전히 존재합니다. 만약 당신이 뭔가를 원한다면, 나는 단지 $somegarbage을 사용 하겠지만 어떤 사람들은 그렇게하고 싶어한다. 그러나 변수가 클로저 범위 (다른 곳이 아닌)에 묶여있는 한 어떤 변수 이름도 사적인 변수에서 작동 할 것이다.

올바른 경로에 있습니다 ...

3

저는 C# 네임 스페이스와 자바 스크립트의 유사점에 대한 질문을 100 %답지는 않지만 답변으로 내 의견을 게시 할 것입니다 (저는 C# 프로그래머가 아닙니다). 이 함수가 완료된 후에 존재할 $ Object에 연결하기 때문에 실제로 private 변수를 만들지 않습니다. 개인 변수가 필요하면 클로저를 사용해야합니다. 사람들은 다음과 같이 보일 :

var myObject = function() { 
    var innerVariable = 'some private value'; 

    return { 
    getter: function() { 
     return innerVariable; 
    } 
    } 
}() 

당신이 undefined를 반환하지만 myObject.getter()를 호출하는 경우 제대로 값을 반환합니다 myObject.innerVariable에 액세스하려고합니다. 이 개념은 자바 스크립트와 일반적인 프로그래밍에 대해 읽고 싶을 것입니다. 희망이 도움이됩니다.

+0

네가 옳다는 것을 나는 눈치 채지 못했다. 그런 다음 공개 변수입니다. 감사 – jsn00bs

0

전역 이름 공간이 오염되는 것을 방지하려면 Module pattern (more) 및 javacript 클로저를 읽고 싶을 수 있습니다.

관련 문제