Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript私有变量访问问题_Javascript_Plugins_Frameworks_Closures - Fatal编程技术网

javascript私有变量访问问题

javascript私有变量访问问题,javascript,plugins,frameworks,closures,Javascript,Plugins,Frameworks,Closures,这是为javascript大师准备的: 我正在试验一个新的javascript框架。它的结构灵感来自强大的jQuery 它有一个名为$j的全局变量,以及。。哦,看看它在起作用: /* file: jfoo.js */ $j = new (function(){ var modules=[]; this.loadModule = function(mod) { modules[ modules.length ] = mod; } this.hasMo

这是为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];
    }
})();

但我没有得到更好的结果

因此,问题是:

  • 是否有任何方法可以将
    loadBatch
    方法写入一个单独的文件中,并且仍然让它访问私有方法
    模块
    ?(我希望答案是响亮的“不”,但谁知道呢?)
  • 有没有其他方法可以在不公开
    模块的情况下达到预期效果?(如果我公开,我知道如何进行)
  • jQuery是否使用私有成员?那么,它是如何克服其“私人可访问性”问题的呢
谢谢


jrh

AFAIK无法将访问“私有”变量(仅在闭包范围内的变量)的权限授予其范围外的某些执行上下文,但不能授予其他执行上下文。(例如,您可以编写访问器方法,但不能限制谁可以访问)

知道jQuery是如何实现的吗?jQuery真的做到了吗?jQuery使用构建步骤将所有文件粘合在一起,然后再发送到客户端。
/* file:loadBatch.jfoo.js */
!$j || (function(){
    $j.extend( {
        loadBatch : function(batch) {
            for(ind in batch)
                modules[ modules.length++ ] = batch[ind];
        }
    });
})();