Проблема доступа к закрытым переменным в JavaScript - PullRequest
1 голос
/ 25 июня 2009

это для гуру 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

1 Ответ

3 голосов
/ 25 июня 2009

AFAIK, нет никакого способа предоставить доступ к "закрытой" переменной (переменная только в пределах замыкания) некоторым контекстам выполнения вне его области, но не другим. (например, вы можете написать метод доступа, но не можете ограничить, кто получает доступ)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...