Javascript:命名空间

时间:2009-10-09 07:20:45

标签: 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;
}();

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

3 个答案:

答案 0 :(得分:5)

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

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

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

在您的命名空间文件中

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();

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

答案 1 :(得分:0)

这很好,但最好将私有变量声明为命名空间中的局部变量,而不是使用一个对象priv。优点:代码少,打包器可能缩小变量名称。尝试在此处打包您的代码:http://dean.edwards.name/packer/

答案 2 :(得分:0)

我认为你的例子很好,整个问题主要是关于品味。但是,我想这样写:

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函数,因此我可以在其中定义私有函数和变量。这略有不同,因为范围甚至比你的例子要小。优点是,同一名称空间中的其他函数可以使用相同的变量名。缺点是,其他功能与该功能不共享相同的变量: - )