【发布时间】:2009-06-25 12:26:42
【问题描述】:
这是为 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
【问题讨论】:
标签: javascript plugins frameworks closures