2009-06-25 16 views
1

これはjavascriptの達人のためのものです。JavaScriptのプライベート変数へのアクセスの問題

私は新しいJavaScriptフレームワークを試しています。その構造は、偉大なjQuery以外には触発されていません。

それは$jと呼ばれるグローバル変数を持ち、そして...ああ、ただのアクションでそれを参照してください。

/* file: jfoo.js */ 
$j = new (function(){ 
    var modules=[]; 
    this.loadModule = function(mod) { 
     modules[ modules.length ] = mod; 
    } 
    this.hasModule = function(mod) { 
     for(ind in modules) 
      if(modules[ind]==mod) return true; 
     return false; 
    } 
})(); 

あなたはモジュールはプライベート変数であることがわかります。問題ない;それは私が意図したものです。

今、自分のシステムに$j.loadBatchメソッドを追加するプラグインを書きたいと思います。 ..だから

/* file: loadBatch.jfoo.js */ 
!$j || (function(){ 
    $j.loadBatch = function(batch) { 
     for(ind in batch) 
      modules[ modules.length++ ] = batch[ind]; 
    } 
})(); 

しかし、この方法は、ファイルjfoo.jsで閉鎖の一部ではないので、これは不可能です。

私はまた、このバージョン試してみました:

/* file: jfoo.js */ 
$j = new (function(){ 
    var modules=[]; 
    this.loadModule = function(mod) { 
     modules[ modules.length ] = mod; 
    } 
    this.hasModule = function(mod) { 
     for(ind in modules) 
      if(modules[ind]==mod) return true; 
     return false; 
    } 
    this.extend = function(extensions) { 
     for(ext in extensions) 
      this[ext] = extensions[ext]; 
    } 
})(); 

/* file:loadBatch.jfoo.js */ 
!$j || (function(){ 
    $j.extend({ 
     loadBatch : function(batch) { 
      for(ind in batch) 
       modules[ modules.length++ ] = batch[ind]; 
     } 
    }); 
})(); 

をしかし、私はより良い結果を得ませんでした。

ので、質問:

  • 私は別のファイルにloadBatch方法を書いて、まだそれはプライベートメソッドmodulesにアクセスすることができます方法はありますか? (私は答えが響きたくないと思っていますが、誰が知っていますか?)
  • modulesを公開せずに希望の効果を達成できる方法はありますか? (私が公開すると進める方法を知っています)
  • jQueryはプライベートメンバーを使用しますか?それはどうやって「プライベート・アクセシビリティ」の問題を乗り越えますか?

おかげで、

JRH

答えて

3

は私の知る限り存在し、その範囲外のいくつかの実行コンテキストに「プライベート」変数(のみクロージャのスコープ内の変数)へのアクセスを提供する方法はませんではなく、その他。 (例えば、アクセッサメソッドを書くことができますが、誰がアクセス権を取得するか制限することはできませんでした)

+0

jQueryはどのようにしていますか? jQueryは実際にそれを行いますか? – jrharshath

+0

jQueryは、ビルドステップを使用して、クライアントに送信する前にすべてのファイルを1つにまとめます。 –

関連する問題