2011-09-22 4 views
7
私は私のスクリプトは、すべて私のサイトに1つの.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

これは、私はあなたがやろうとしているパターンを実装する方法をもっとです:

// 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になります)。 2番目はwindow.MySiteにアクセスするのではなく、拡張するオブジェクトを渡します(この場合は私はrootと呼んでいます)。これにより、柔軟性が得られます。

プライベートメソッドは本当にプライベートではありませんでした。プライベートメソッドを作成するには、クロージャでバインドされた関数varを作成したいだけで、外部から見えるオブジェクトのプロパティには割り当てられません。最後に、おそらく$.somegarbageを使用したくないでしょう。コメントに記載されているように、オブジェクトを$に追加していますが、クロージャが終了してもまだそこにあります。もしあなたが何かを近づけたいのであれば、私はちょうど$somegarbageを使ってみる人もいますが、変数がクロージャのスコープ内にある限り、変数はプライベート変数として働きます。

正しい軌道に乗っています...

3

私は100%ではないが、C#ネームスペースとそのパラレルのJavaScript(私はC#プログラマーではない)についてのあなたの質問に答えているが、答えとして私のコメントを投稿する。この関数が終了した後に存在するオブジェクト$にそれらを添付しているので、実際にプライベート変数を作成していません。プライベート変数が必要な場合は、クロージャを使用する必要があります。それらはこのような何かを見て:

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

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

あなたはそれがundefinedを返しますが、あなたはmyObject.getter()を呼び出す場合、それは正しく値を返しますmyObject.innerVariableにアクセスしようとします。このコンセプトは、JavaScriptや一般的なプログラミングで読んでみたいことです。希望が役立ちます。

+0

はい、あなたは正しいです、私はそれに気付かなかった。それらは次に公共の変数です。ありがとう – jsn00bs

0

グローバル名空間を汚染しないようにするには、Module patternmore)とjavascriptでクローズしてください。

関連する問題