javascript私有(private)变量访问问题

标签 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;
    }
})();

你看到模块是一个私有(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/

相关文章:

javascript比较对象数组

c++ - 插件如何使用 C++ 调用其他插件?

java - 为什么 if 语句检测不到我的游戏状态

带包的 Cocoa 应用程序框架

php - 适用于大型项目的 CakePHP

javascript - 当比较日期接近时,Moment js diff 出现意外结果

javascript - 如何在没有 eval 的情况下编写这段 JavaScript 代码(QUnit 模拟)?

Android gradle插件错误

xcode - 如何在Xcode中编译框架?

javascript - 从另一个函数访问模块中的函数