代码之家  ›  专栏  ›  技术社区  ›  olliej

在JavaScript中是否有一种“简洁”的名称空间设置方法?

  •  14
  • olliej  · 技术社区  · 17 年前

    namespace

    namespaces = { com : { example: { example.com's data} }
    

    然而,相对于其他名称空间框架安全地设置它似乎需要相对大量的代码(定义为>2行)。我想知道是否有人知道一个简洁的方法来做到这一点?此外,是否有一种相对标准/一致的方法来构建它?例如,是 com 命名空间直接附加到全局对象,还是通过命名空间对象附加?

    [编辑:哇,很明显 {com = { ... } } 由于Shog9指出了这一点,我无法完成任何接近我预期的事情。]

    8 回复  |  直到 8 年前
        1
  •  19
  •   David Underhill    14 年前

    Javascript没有独立的名称空间。它有函数(可以提供解析名称的范围)和对象(可以提供给定范围内可访问的命名数据)。

    下面是您的示例,已更正:

    var namespaces = { com: { example: { /* example.com's data */ } } }
    

    这是一个变量 namespaces com ,一个具有一个属性的对象: example ,一个可能包含有趣内容的对象。

    所以,你可以输入如下内容 SomeProperty或FunctionOne示例 一切都会成功的。当然,这也很可笑。你没有层次化的名称空间,你有一个包含一个对象的对象,这个对象包含一个你真正关心的对象。

    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() { /* ... */ }
           };
        })();
    

    …我认为这是相当简洁的。

        2
  •  12
  •   Joseph Pecoraro    17 年前

    这里有一篇有趣的文章,作者是彼得·米肖 Javascript Namespacing

    1. 前缀名称空间
    2. 单对象名称空间
    3. 嵌套对象名称空间

    Peter甚至指出,其中一些产品还存在性能方面的考虑因素。考虑到新的ECMAScript Harmony计划已经放弃了名称空间和打包的4.0计划,我认为讨论这个主题会很有趣。

        3
  •  6
  •   Polsonby    17 年前

    我试图遵循雅虎的惯例,在全局范围内创建一个单亲对象来包含所有内容;

    var FP = {};
    FP.module = {};
    FP.module.property = 'foo';
    
        4
  •  5
  •   Ricky    17 年前

    若要确保不覆盖现有对象,请执行以下操作:

    if(!window.NameSpace) {
        NameSpace = {};
    }
    

    var NameSpace = window.NameSpace || {};
    

    通过这种方式,您可以将其放在应用程序/网站中每个文件的顶部,而不用担心名称空间对象被覆盖。您还可以为每个单元单独编写测试。

        5
  •  3
  •   Brendan    17 年前

    YUI library 库中有一些代码,这些代码使用一个您可能更喜欢的函数来处理名称空间。其他库也可以这样做。

        6
  •  1
  •   Mark Cidade    17 年前

    作为点或下划线的替代,您可以使用美元符号字符:

    var namespaces$com$example = "data"; 
    
        7
  •  1
  •   dfa    17 年前

    我也喜欢这个( source ):

    (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/>';​
    
        8
  •  0
  •   Community Mohan Dere    9 年前

    使用对象文字和 this 对象或显式名称,以根据包含函数的局部变量的同级属性进行命名空间。例如:

    var foo = { bar: function(){return this.name; }, name: "rodimus" }
    var baz = { bar: function(){return this.name; }, name: "optimus" }
    
    console.log(foo.bar());
    console.log(baz.bar());

    name

    var foo = { bar: function rodimus(){return this; } }
    var baz = { bar: function optimus(){return this; } }
    
    console.log(foo.bar.name);
    console.log(baz.bar.name);

    或者不使用 :

    var foo = { bar: function rodimus(){return rodimus; } }
    var baz = { bar: function optimus(){return optimus; } }
    
    console.log(foo.bar.name);
    console.log(baz.bar.name);

    RegExp Object hasOwnProperty 要进行检查的测试:

     var foo = RegExp(/bar/);
     
    /* Add property */
    foo.name = "alpha";
    
    document.body.innerHTML = String("<pre>" + ["name", "value", "namespace"] + "</pre>").replace(/,/g, "&#09;");
    
    /* Check type */
    if (foo.hasOwnProperty("name")) 
      {
      document.body.innerHTML += String("<pre>" + ["foo", String(foo.exec(foo)), foo.name] + "</pre>").replace(/,/g, "&#09;");
      }
    
    /* Fallback to atomic value */
    else 
      {
      foo = "baz";
      }
    
    var counter = Object(1);
    
    /* Add property */
    counter.name = "beta";
    
    if (counter.hasOwnProperty("name")) 
      {
      document.body.innerHTML += String("<pre>" + ["counter", Number(counter), counter.name] + "</pre>").replace(/,/g, "&#09;");
      } 
    else 
      {
      /* Fallback to atomic value */
      counter = 0;
      }

    DOM使用以下约定命名HTML和SVG元素接口定义的名称空间:

    • HTMLTitleElement
    • SVGTitleElement

    JavaScript核心使用原型来命名名称空间 toString 方法作为多态性的一种简单形式。