在JavaScript中是否有一种"简洁"的命名空间方法?
我经常遇到一些网站,这些网站将所有JavaScript都沿着" namespace"结构放置:
namespaces = { com : { example: { example.com's data} }
但是,相对于其他命名空间框架安全地设置它似乎需要相对大量的代码(定义为> 2行)。我想知道是否有人知道这样做的简洁方法?此外,是否存在相对标准/一致的结构方式?例如,com
命名空间是直接添加到全局对象,还是通过命名空间对象添加?
[编辑:糟糕,显然{{com = {...}}`并不能完成我想要的任何事情,这要感谢Shog9指出了。]
解决方案
回答
Javascript没有独立的名称空间。它具有可以提供解析名称范围的功能以及可以在给定范围内访问可访问的命名数据的对象。
这是示例,已更正:
var namespaces = { com: { example: { /* example.com's data */ } } }
这是一个变量"名称空间",被分配了一个对象常量。该对象包含一个属性:com,具有一个属性的对象:example,可能包含一些有趣的对象。
因此,我们可以输入诸如namespaces.com.example.somePropertyOrFunctionOnExample之类的内容,即可正常工作。当然,这也是荒谬的。我们没有分层的名称空间,我们有一个包含一个对象的对象,该对象包含一个我们实际关心的东西。
var com_example_data = { /* example.com's data */ };
在没有毫无意义的层次结构的情况下,它也同样有效。
现在,如果我们实际上要构建层次结构,则可以尝试如下操作:
com_example = com_example || {}; com_example.flags = com_example.flags || { active: false, restricted: true}; com_example.ops = com_example.ops || (function() { var launchCodes = "38925491753824"; // hidden / private return { activate: function() { /* ... */ }, destroyTheWorld: function() { /* ... */ } }; })();
...恕我直言,简明扼要。
回答
YUI库库中的代码使用可能会更受欢迎的函数来处理命名空间。其他库也可以这样做。
回答
这是Peter Michaux撰写的有关Javascript Namespacing的有趣文章。他讨论了3种不同类型的Javascript名称空间:
- 前缀命名空间
- 单个对象的命名空间
- 嵌套对象的命名空间
我不会窃他在这里说的话,但我认为他的文章很有启发性。
彼得甚至指出其中有些是性能方面的考虑。考虑到新的ECMAScript Harmony计划已删除4.0的命名空间和打包计划,我认为谈论这个话题会很有趣。
回答
我尝试遵循Yahoo约定,即在全局范围内制作单个父对象以包含所有内容。
var FP = {}; FP.module = {}; FP.module.property = 'foo';
回答
作为点或者下划线的替代,我们可以使用美元符号字符:
var namespaces$com$example = "data";
回答
为了确保不覆盖现有对象,我们应该这样做:
if(!window.NameSpace) { NameSpace = {}; }
或者
var NameSpace = window.NameSpace || {};
这样,我们可以将其放在应用程序/网站中每个文件的顶部,而不必担心覆盖名称空间对象。同样,这将使我们能够分别为每个文件编写单元测试。
回答
我也喜欢这个(来源):
(function() { var a = 'Invisible outside of anonymous function'; function invisibleOutside() { } function visibleOutside() { } window.visibleOutside = visibleOutside; var html = '--INSIDE Anonymous--'; html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside; html += '<br/> typeof visibleOutside: ' + typeof visibleOutside; contentDiv.innerHTML = html + '<br/><br/>'; })(); var html = '--OUTSIDE Anonymous--'; html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside; html += '<br/> typeof visibleOutside: ' + typeof visibleOutside; contentDiv.innerHTML += html + '<br/>';?