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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在命名空间中创建私有变量?相关的知识,希望对你有一定的参考价值。

对于我的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;

或者设计模式是否是别的?

答案

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

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;
    })()
};
另一答案

Douglas Crockford推广所谓的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并没有真正拥有私有变量,我认为这有点像一个破坏其他东西的淤泥。例如,尝试从该类继承。

另一答案

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的值设置为up并返回其值。

以上是关于如何在命名空间中创建私有变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在公共方法中创建私有变量

在JavaScript中创建命名空间的几种写法

如何在特定命名空间中创建 K8S 部署?

ReactiveMongoDatabase:如何预先创建集合:无法在多文档事务中创建命名空间

在标头和源代码 (cpp) 中创建 C++ 命名空间

如何在 C# 中创建具有命名空间的文档