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

+0

jQuery использует шаг сборки для склеивания всех файлов вместе в один перед отправкой клиенту. –