2009-10-09 111 views
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; 
}(); 

我希望你的想法。有没有办法创建你认为更清洁或更好的命名空间(解释原因)?

+0

重复:http:// stackoverflow。com/questions/6549629/preferred-technique-for-javascript-namespacing(新问题更清楚) – 2012-06-15 11:28:37

回答

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

现在,单身 - 这就是整个的另一个理由。

+0

我认为你的例子已经坏了。 “private”和“public”不能用作变量名称,因为它们是保留的:http://javascript.about.com/library/blreserved.htm。其次,“public”和“public_func”都不可用。 – 2009-10-09 08:49:47

+0

他可能没有想到:)你错了,public和public_func可以通过Namespace.stuff.public和Namespace.stuff.public_funct到达。 谢谢贾斯汀,我最喜欢你的方法。谢谢你,蒂姆,你的例子可以与其他模式相结合,将是有益的。 – 2009-10-09 13:32:39

0

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

0

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

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

首先,命名空间应该是所有大写在前,像道格拉斯Crockford的建议,并通过雅虎看到。

其次,我直接创建带有其属性的NAMESPACE,而不是通过匿名函数。但是我在匿名函数中创建了publicFunction1函数,所以我可以在其中定义私有函数和变量。这有些不同,因为在你的例子中,范围更小。好处是,相同名称空间内的其他函数可以使用相同的变量名称。缺点是,其他函数不会与该函数共享相同的变量:-)