代码之家  ›  专栏  ›  技术社区  ›  Kaze no Koe

javascript:名称间距

  •  5
  • Kaze no Koe  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  5
  •   Justin Van Horne    15 年前

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

    我喜欢这个方法的原因是它更加模块化,允许将代码分解成多个文件,然后很容易地将它们压缩成一个没有依赖关系的文件(除非名称空间函数彼此依赖)。

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

    在命名空间文件中

    var Namespace = {};
    

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

    var Namespace = Namespace === undefined ? {} : Namespace;
    
    Namespace.stuff = function () {
        var private = 'foo';
        function private_func() {
        };
    
        this.public = 'bar';
        this.public_func = function () {
        }
    };
    

    一些实际应用是:

    吉伊斯

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

    工具库

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

    菜单.js

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

    现在,单身汉,这是另一个论点。

        2
  •  0
  •   Anatoliy    15 年前

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

        3
  •  0
  •   Tim Büthe    15 年前

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

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

    首先,名称空间应该都是upercase,就像道格拉斯·克罗克福德建议的那样,正如雅虎看到的那样。

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