首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript:名称空间

Javascript:名称空间
EN

Stack Overflow用户
提问于 2009-10-09 07:20:45
回答 3查看 997关注 0票数 5

我目前使用以下模式在Javascript中创建名称空间和单例对象:

代码语言: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;
}();

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-09 08:07:59

实际上,这一切都是关于语义的。如果您要将代码拆分成多个文件,并计划使用一个通用名称空间,那么这样做会更容易一些:

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

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

命名空间文件中的

代码语言:javascript
复制
var Namespace = {};

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

代码语言:javascript
复制
var Namespace = Namespace === undefined ? {} : Namespace;

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

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

一些实际应用将是:

GUI.js

代码语言:javascript
复制
// Some general GUI
var GUI = {
    'MAX_WIDTH': $(window).width(),
    'MAX_HEIGHT': $(window).height()
};

Toolbar.js

代码语言:javascript
复制
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

代码语言:javascript
复制
GUI.Menu = function () {
}; GUI.Menu.prototype = new GUI.Toolbar();

现在,单例--这完全是另一回事。

票数 5
EN

Stack Overflow用户

发布于 2009-10-09 07:30:24

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

票数 0
EN

Stack Overflow用户

发布于 2009-10-09 08:43:59

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

代码语言:javascript
复制
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看到的那样。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1542295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档