2009-06-25 123 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

AFAIK有沒有辦法給(僅封閉的範圍內變化)獲得了「私有」變量,其範圍之外的一些執行上下文,但不其他。 (例如,你可以寫一個訪問器方法,但不能限制誰可以訪問)

+0

任何想法如何jQuery做到這一點? jQuery實際上做到了嗎? – jrharshath 2009-06-25 14:17:26