javascript私有变量访问问题

时间:2009-06-25 12:26:43

标签: 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.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? (我希望答案是一个响亮的NO,但是,谁知道呢?)
  • 有没有其他方法可以在不公开modules的情况下实现所需的效果? (如果我公之于众,我知道该怎么办)
  • jQuery使用私有成员吗?它是如何克服其“私人可访问性”问题的呢?

谢谢,

JRH

1 个答案:

答案 0 :(得分:3)

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