这是给 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;
}
})();
你看到模块是一个私有(private)变量。没问题;这正是我想要的。
现在,我想编写一个插件,将 $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
方法,并且仍然可以访问私有(private)方法modules
? (我希望答案是响亮的“否”,但是,谁知道呢?) - 有没有其他方法可以在不公开
modules
的情况下达到预期的效果? (如果公开,我知道如何进行) - jQuery 是否使用私有(private)成员?那么它是如何克服“私有(private)可访问性”问题的呢?
谢谢,
jrh
最佳答案
据我所知,没有办法将“私有(private)”变量(仅在闭包范围内的变量)的访问权限授予其范围之外的某些执行上下文,而不是其他执行上下文。 (例如,您可以编写访问器方法但不能限制谁可以访问)
关于javascript私有(private)变量访问问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043623/