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