【问题标题】:Javascript: namespacingJavascript:命名空间
【发布时间】:2010-12-05 06:21:52
【问题描述】:

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

我希望你明白这一点。有没有一种方法可以创建您认为更干净或更好的命名空间(解释原因)?

【问题讨论】:

标签: javascript namespaces


【解决方案1】:

实际上,这都是关于语义的。如果您将代码拆分为多个文件并计划使用通用命名空间,那么执行以下操作会更容易一些:

我喜欢这种方法的原因是它更加模块化,并且允许将代码分解为多个文件,然后可以轻松地将它们压缩为一个而不会出现依赖问题(除非您的命名空间函数相互依赖)

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

在您的命名空间文件中

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

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

【讨论】:

  • 我认为你的例子是坏的。 “private”和“public”不能用作变量名,因为它们是保留的:javascript.about.com/library/blreserved.htm。其次,“public”和“public_func”都不可达。
  • 他可能没有想到 :) 你错了,public 和 public_func 可以通过 Namespace.stuff.public 和 Namespace.stuff.public_funct 访问。谢谢贾斯汀,我最喜欢你的方法。也感谢蒂姆,您的示例可以与其他模式结合使用,并且会很有用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    首先,命名空间应该全部大写,就像 Douglas Crockford 所建议的和 YAHOO 看到的那样。

    其次,我直接使用其属性创建 NAMESPACE,而不是通过匿名函数。但是我在一个匿名函数中创建了 publicFunction1 函数,所以我可以在其中定义私有函数和变量。这略有不同,因为范围比您的示例中的范围更小。优点是,同一命名空间内的其他函数可以使用相同的变量名。缺点是,其他函数不与该函数共享相同的变量:-)

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 2011-03-25
      • 1970-01-01
      • 2011-01-31
      • 2013-03-10
      • 2011-12-05
      • 2015-11-15
      • 2013-09-12
      相关资源
      最近更新 更多