Javascript: пространство имен - PullRequest
5 голосов
/ 09 октября 2009

В настоящее время я использую следующий шаблон для создания пространств имен и одноэлементных объектов в Javascript:

var Namespace = function () {

    var priv = {
        privateVar1: '',
        privateVar2: '',
        privateFunction1: function () {
            //do stuff
            [...]
        },
        [...]
    };

    var pub = {
        publicVar1: '',
        publicFunction1: function () {
                //do stuff with private functions and variables
                priv.privateVar1 = priv.privateFunction1(pub.publicVar1);
            [...]
        },
        [...]
    };

    return pub;
}();

Я надеюсь, вы поняли идею. Есть ли способ создать пространства имен, которые вы считаете более чистыми или лучше (объясните почему)?

Ответы [ 3 ]

5 голосов
/ 09 октября 2009

На самом деле, это все о семантике. Если вы разбиваете код на несколько файлов и планируете использовать общее пространство имен, то сделать что-то вроде этого немного проще:

Причина, по которой мне нравится этот метод, заключается в том, что он гораздо более модульный и позволяет разбивать код на несколько файлов, а затем просто сжимать их в один без проблем с зависимостями (если ваши функции пространства имен не зависят друг от друга)

Недостатком этого является то, что иногда он может быть немного грязным, если используется неправильно - что, я думаю, может относиться ко всему.

В вашем файле пространства имен

var Namespace = {};

В других ваших файлах JavaScript, которые используют пространство имен

var Namespace = Namespace === undefined ? {} : Namespace;

Namespace.stuff = function () {
    var private = 'foo';
    function private_func() {
    };

    this.public = 'bar';
    this.public_func = function () {
    }
};

Некоторое практическое применение будет:

GUI.js

// Some general GUI
var GUI = {
    'MAX_WIDTH': $(window).width(),
    'MAX_HEIGHT': $(window).height()
};

toolbar.js

GUI.Toolbar = function (id) {
    var self = this;

    function init_visuals() {
        $(id).click(function () {
            self.alert_broken();
        });
    };

    function initialize() {
        init_visuals();
    };

    this.alert_broken = function () {
        alert('Broken!');
    };

    initialize();
};

Menu.js

GUI.Menu = function () {
}; GUI.Menu.prototype = new GUI.Toolbar();

Теперь, синглтонс - это еще один аргумент.

0 голосов
/ 09 октября 2009

Я думаю, что ваш пример просто великолепен, и весь этот вопрос в основном касается вкуса. Тем не менее, я написал это так:

var NAMESPACE = {

    publicVar1: '', 
    publicFunction1: (function(){

        var privateVar1 = '';
        var privateVar2 = '';
        function privateFunction1 () {
            //do stuff
            //[...]
        };

        return function(){
            //do stuff with private functions and variables
            priv.privateVar1 = priv.privateFunction1(pub.publicVar1);
        }
    })()
}

Прежде всего, пространство имен должно быть все вверх, как предлагает Дуглас Крокфорд и как это видно из YAHOO.

Во-вторых, я создаю NAMESPACE с его свойствами напрямую, а не через анонимную функцию. Но я создал функцию publicFunction1 внутри анонимной функции, чтобы я мог определять частные функции и переменные внутри нее. Это немного отличается, потому что область действия даже меньше, чем в вашем примере. Преимущество состоит в том, что другие функции в том же пространстве имен могут использовать те же имена переменных. Недостатком является то, что другие функции не имеют общих переменных с этой функцией: -)

0 голосов
/ 09 октября 2009

Это хорошо, но лучше объявить закрытые переменные как локальные переменные в пространстве имен, а не использовать один объект priv. Преимущества: меньше кода, упаковщик может уменьшить имена переменных. Попробуйте упаковать свой код здесь: http://dean.edwards.name/packer/

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