【问题标题】:javascript private variables access problemjavascript私有变量访问问题
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 知道 jQuery 是如何做到的吗? jQuery 真的做到了吗?
    • jQuery 使用构建步骤将所有文件粘合在一起,然后发送到客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2015-09-25
    • 2012-05-09
    • 2018-11-02
    • 1970-01-01
    • 2012-06-17
    • 2016-07-03
    相关资源
    最近更新 更多