当前位置:首页 > PHP教程 > php应用 > 列表

JavaScript创建命名空间的5种写法

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-02 14:25:12 浏览: 评论:0 

这篇文章主要介绍了JavaScript创建命名空间的5种写法,命名空间的主旨在于解决命名冲突的问题,需要的朋友可以参考下。

在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子:

  1. var sayHello = function() { 
  2.   return 'Hello var'
  3. }; 
  4. function sayHello(name) { 
  5.   return 'Hello function'
  6. }; 
  7.  
  8. sayHello(); 

最终的输出为:

> "Hello var"

为什么会这样,根据 StackOverFlow 的解释,实际上JavaScript的是按如下顺序解析的,代码如下:

  1. function sayHello(name) { 
  2.   return 'Hello function'
  3. }; 
  4. var sayHello = function() { 
  5.   return 'Hello var'
  6. }; 
  7.  
  8. sayHello(); 

不带var的function声明被提前解析了,因此现代的JS写法建议你始终使用前置var声明所有变量;

避免全局变量名冲突的最好办法还是创建命名空间,下面是在JS中合建命名空间的几种常用方法。

一、通过函数(function)创建

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

  1. var NameSpace = NameSpace || {}; 
  2. /* 
  3. Function 
  4. */ 
  5. NameSpace.Hello = function() { 
  6.   this.name = 'world'
  7. }; 
  8. NameSpace.Hello.prototype.sayHello = function(_name) { 
  9.   return 'Hello ' + (_name || this.name); 
  10. }; 
  11. var hello = new NameSpace.Hello(); 
  12. hello.sayHello(); 

这种写法比较冗长,不利于压缩代码(jQuery使用fn代替prototype),而且调用前需要先实例化(new)。使用Object写成JSON形式可以写得紧凑些:

二、通过JSON对象创建Object,代码如下:

  1. /* 
  2. Object 
  3. */ 
  4. var NameSpace = NameSpace || {}; 
  5. NameSpace.Hello = { 
  6.     name: 'world' 
  7.   , sayHello: function(_name) { 
  8.     return 'Hello ' + (_name || this.name); 
  9.   } 
  10. }; 

调用代码如下:

NameSpace.Hello.sayHello('JS');

> Hello JS;

这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加this指示作用域,写法也略有冗余。

三、通过闭包(Closure)和Object实现

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

  1. var NameSpace = NameSpace || {}; 
  2. NameSpace.Hello = (function() { 
  3.   //待返回的公有对象 
  4.   var self = {}; 
  5.   //私有变量或方法 
  6.   var name = 'world'
  7.   //公有方法或变量 
  8.   self.sayHello = function(_name) { 
  9.     return 'Hello ' + (_name || name); 
  10.   }; 
  11.   //返回的公有对象 
  12.   return self; 
  13. }()); 

四、Object和闭包的改进型写法

上个例子在内部对公有方法的调用也需要添加self,如:self.sayHello(); 这里可以最后再返回所有公有接口(方法/变量)的JSON对象,代码如下:

  1. var NameSpace = NameSpace || {}; 
  2. NameSpace.Hello = (function() { 
  3.   var name = 'world'
  4.   var sayHello = function(_name) { 
  5.     return 'Hello ' + (_name || name); 
  6.   }; 
  7.   return { 
  8.     sayHello: sayHello 
  9.   }; 
  10. }()); 

五、Function的简洁写法

这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new),方案来自stackoverflow:

  1. var NameSpace = NameSpace || {}; 
  2. NameSpace.Hello = new function() { 
  3.   var self = this; 
  4.   var name = 'world'
  5.   self.sayHello = function(_name) { 
  6.     return 'Hello ' + (_name || name); 
  7.   }; 
  8. }; 

Tags: JavaScript创建命名空间

分享到: