Как создать приватные переменные в пространстве имен? - PullRequest
10 голосов
/ 10 ноября 2010

Для моего веб-приложения я создаю пространство имен в 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 ]

8 голосов
/ 10 ноября 2010

Дуглас Крокфорд популяризировал так называемый Шаблон модуля , где вы можете создавать объекты с «закрытыми» переменными:

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 действительно не имеет частных переменных, и ядумаю, что это что-то вроде кучи, которая ломает другие вещи.Просто попробуйте наследовать от этого класса, например.

8 голосов
/ 10 ноября 2010

Замыкания часто используются для симуляции частных переменных:

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;
    })()
};
0 голосов
/ 31 августа 2018

Через 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 один и возвращает его значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...