Javascript:命名空间

Kaz*_*Koe 5 javascript namespaces

我目前正在使用以下模式在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;
}();
Run Code Online (Sandbox Code Playgroud)

我希望你明白这个主意.有没有办法创建您认为更清洁或更好的命名空间(解释原因)?

Jus*_*rne 5

实际上,这完全是语义学.如果您将代码分开多个文件并计划使用通用命名空间,那么执行此类操作会更容易一些:

我喜欢这种方法的原因是它更加模块化,允许将代码分解为多个文件,然后就可以轻松地将它们压缩成一个没有依赖性问题的代码(除非你的命名空间函数依赖于彼此)

这样做的缺点是,如果使用不正确,有时会感觉有点混乱 - 我猜这可能适用于任何事情.

在命名空间文件中

var Namespace = {};
Run Code Online (Sandbox Code Playgroud)

在您使用命名空间的其他JavaScript文件中

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

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

    this.public = 'bar';
    this.public_func = function () {
    }
};
Run Code Online (Sandbox Code Playgroud)

一些实际应用将是:

GUI.js

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

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();
};
Run Code Online (Sandbox Code Playgroud)

Menu.js

GUI.Menu = function () {
}; GUI.Menu.prototype = new GUI.Toolbar();
Run Code Online (Sandbox Code Playgroud)

现在,单身人士 - 这是另一个论点.