этот для гуру 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
любая идея, как это делает jQuery? Действительно ли jQuery это делает? – jrharshath
jQuery использует шаг сборки для склеивания всех файлов вместе в один перед отправкой клиенту. –