如何在命名空间中创建私有变量?

时间:2010-11-10 20:21:48

标签: javascript namespaces private-members

对于我的Web应用程序,我在JavaScript中创建一个命名空间,如下所示:

var com = {example: {}};
com.example.func1 = function(args) { ... }
com.example.func2 = function(args) { ... }
com.example.func3 = function(args) { ... }

我还想创建“私有”(我知道这在JS中不存在)命名空间变量,但我不确定什么是最好的设计模式。

是不是:

com.example._var1 = null;

或者设计模式是别的吗?

3 个答案:

答案 0 :(得分:8)

闭包经常像这样用来模拟私有变量:

var com = {
    example: (function() {
        var that = {};

        // This variable will be captured in the closure and
        // inaccessible from outside, but will be accessible
        // from all closures defined in this one.
        var privateVar1;

        that.func1 = function(args) { ... };
        that.func2 = function(args) { ... } ;

        return that;
    })()
};

答案 1 :(得分:8)

道格拉斯·克罗克福德推广所谓的Module Pattern,您可以使用“私人”变量创建对象:

myModule = function () {

        //"private" variable:
        var myPrivateVar = "I can be accessed only from within myModule."

        return  {
                myPublicProperty: "I'm accessible as myModule.myPublicProperty"
                }
        };

}(); // the parens here cause the anonymous function to execute and return

但正如你所说Javascript并没有真正拥有私有变量,而且我认为这有点像是一个破坏其他东西的混乱。例如,尝试从该类继承。

答案 2 :(得分:0)

7年后,这可能会来得很晚,但是我认为这可能对遇到类似问题的其他程序员很有用。

几天前,我想到了以下功能:

{
    let id    = 0;                          // declaring with let, so that id is not available from outside of this scope
    var getId = function () {               // declaring its accessor method as var so it is actually available from outside this scope
        id++;
        console.log('Returning ID: ', id);
        return id;
    }
}

仅当您位于全局范围内并且要声明一个变量,该变量只能将id的值设置为1并返回其值时,才能从任何地方访问该变量。