JavaScript命名空间

JavaScript命名空间

由于JavaScript没有文件作用域,不同的函数分散在不同的文件中,甚至由不同的人编写,重名的概率大大增加。是不是足够小心就可以了呢?也不尽然,还有些意外情况,比如经常会用到继承。我们可以通过C#、Java类似的命名空间解决这些问题。

JS中命名空间机制的实现方式

1、通过函数(function)创建

这是一种比较常见的写法,通过声明一个function实现,函数里设置初始变量,公共方法写入prototype,如:

  •  
  • JScript 代码   复制
  • 
    var NameSpace = NameSpace || {};
    /*
    Function
    */
    NameSpace.Hello = function() {
      this.name = 'world';
    };
    NameSpace.Hello.prototype.sayHello = function(_name) {
      return 'Hello ' + (_name || this.name);
    };
    var hello = new NameSpace.Hello();
    hello.sayHello();
    
    		
  • 或者

  •  
  • JScript 代码   复制
  • 
    var NameSpace = NameSpace || {};
    NameSpace.Hello = new function() {
      var self = this;
      var name = 'world';
      self.sayHello = function(_name) {
        return 'Hello ' + (_name || name);
      };
    };
    
    
    		
  • 2、通过JSON对象创建Object

  •  
  • JScript 代码   复制
  • 
    /*
    Object
    */
    var NameSpace = NameSpace || {};
    NameSpace.Hello = {
        name: 'world'
      , sayHello: function(_name) {
        return 'Hello ' + (_name || this.name);
      }
    };
    
    		
  • 调用

    NameSpace.Hello.sayHello('JS');

    3、通过闭包和Object实现

    在闭包中声明好所有变量和方法,并通过一个JSON Object返回公有接口:

  •  
  • JScript 代码   复制
  • 
    var NameSpace = NameSpace || {};
    NameSpace.Hello = (function() {
      //待返回的公有对象
      var self = {};
      //私有变量或方法
      var name = 'world';
      //公有方法或变量
      self.sayHello = function(_name) {
        return 'Hello ' + (_name || name);
      };
      //返回的公有对象
      return self;
    }());
    
    		
  • 或者

  •  
  • JScript 代码   复制
  • 
    var NameSpace = NameSpace || {};
    NameSpace.Hello = (function() {
      var name = 'world';
      var sayHello = function(_name) {
        return 'Hello ' + (_name || name);
      };
      return {
        sayHello: sayHello
      };
    }());