【问题标题】:How to provide namespaces in JavaScript with instanced objects如何在 JavaScript 中为实例化对象提供命名空间
【发布时间】:2010-09-06 13:59:45
【问题描述】:

我有一个 JavaScript “对象”,以这种方式构建:

function foo()
{
    this.length = 0;
}

foo.prototype.getLength = function()
{
    return this.length;
}

...

我知道如何使用单例 JavaScript 对象来模拟命名空间,但是将实例化的上述对象“命名空间”的最佳方法是什么?

我知道有几个 JavaScript 库具有命名空间功能,但我使用的是 jQuery,并且不想再添加另一个库。我希望能够为我需要实例化的 JS 对象提供我自己的,也许是通过利用 jQuery,内在命名空间方案。

谢谢 rp

【问题讨论】:

    标签: javascript namespaces


    【解决方案1】:

    简单:

    if(!MyNamespace) MyNamespace = {};
    
    MyNamespace.foo = function() {
       this.length = 0;
    };
    MyNamespace.foo.prototype.getLength = function() {
       return this.length;
    };
    

    【讨论】:

    • @Chameleon - 嗯?你在说什么?! “原型”是一个自动属性,它本身不必“创建”
    【解决方案2】:

    Javascript 并不像其他语言那样真正具有命名空间或包。相反,它有闭包。如果您的应用程序包含多个函数、变量和对象,那么您应该将它们放在一个全局对象中。这将具有与命名空间相同的效果。

    例如:

    var namespace = {
      this.foo: function(){
        ...
      },
      this.foo.prototype.getLength: function(){
        ...
      }
    }
    

    您还可以创建一组嵌套对象并模拟包:

    loadPackage = function(){
      var path = arguments[0];
      for(var i=1; i<arguments.length; i++){
        if(!path[arguments[i]]){
          path[arguments[i]] = {};
        }
        path = path[arguments[i]];
      }
      return path;
    }
    
    loadPackage(this, "com", "google", "mail") = {
      username: "gundersen",
      login: function(password){
        ...
      }
    }
    this.com.google.mail.login("mySecretPassword");
    

    【讨论】:

    • 很好的提示 - 但我认为您在第一个示例中需要冒号而不是分号,不是吗?
    【解决方案3】:

    应该不会有太大的不同:

    namespace.foo = function foo() {...}
    namespace.foo.prototype.getLength = function() { ... }
    

    或者你可以使用

    (function() {
      function foo() { ... }
      foo.prototype...
      namespace.foo = foo;
    })();
    

    节省一些输入。

    【讨论】:

      【解决方案4】:

      两个答案都非常有帮助!这是我最终得到的结果:

      if( typeof( rpNameSpace ) == "undefined" ) rpNameSpace = {};
      
      rpNameSpace.foo = function() {
          this.length = 613;
      }
      rpNameSpace.foo.prototype.getLength = function() {
          return this.length * 2;
      }
      

      然后,使用生成的“命名空间”对象:

      var x = new rpNameSpace.foo()
      
      display( x.getLength() );
      

      【讨论】:

        【解决方案5】:

        另一种选择可能是bob.js 框架:

        bob.ns.setNs('myApp.myFunctions', { 
            say: function(msg) {  
                console.log(msg); 
            } 
        }); 
        
        //sub-namespace
        bob.ns.setNs('myApp.myFunctions.mySubFunctions', { 
            hello: function(name) { 
                myApp.myFunctions.say('Hello, ' + name); 
            } 
        }); 
        
        //call:
        myApp.myFunctions.mySubFunctions.hello('Bob'); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-12
          • 1970-01-01
          • 1970-01-01
          • 2019-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多