How to provide namespaces in JavaScript with instanced objects

后端 未结 5 2074
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-03 10:42

I\'ve got a JavaScript \"object\", built this way:

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

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

...         


        
相关标签:
5条回答
  • 2021-02-03 11:06

    Another alternative may be the bob.js framework:

    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'); 
    
    0 讨论(0)
  • 2021-02-03 11:09

    Javascript doesn't really have namespace or packages like other languages. Instead it has closures. If you have an application that consists of multiple functions, variables and objects, then you should put them inside a single global object. This will have the same effect as a namespace.

    For example:

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

    You could also create a set of nested objects and simulate packages:

    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");
    
    0 讨论(0)
  • 2021-02-03 11:15

    Shouldn't be much different:

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

    or you could use

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

    to save some typing.

    0 讨论(0)
  • 2021-02-03 11:15

    Both answers were very helpful! Here's what I ended up with:

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

    Then, to use the resulting "namespaced" object:

    var x = new rpNameSpace.foo()
    
    display( x.getLength() );
    
    0 讨论(0)
  • 2021-02-03 11:21

    Simple:

    if(!MyNamespace) MyNamespace = {};
    
    MyNamespace.foo = function() {
       this.length = 0;
    };
    MyNamespace.foo.prototype.getLength = function() {
       return this.length;
    };
    
    0 讨论(0)
提交回复
热议问题