引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,呵呵)。命名空间的引入相当程度上解决了这个问题,当然,如果你使用的命名空间和其他公司不幸一样,而对方又是微软、SUN等大佬,那恭喜你,呵呵@_@! 
     从事Web开发不可避免要接触JavaScript,目前最新版本的JavaScript还是不支持命名空间,所以命名冲突的问题凸显无疑,想象一下你引用了两个js文件,却发现由于命名问题导致你不得不放弃其中一个,从而导致多写了许多代码,无疑是十分令人沮丧的。在JavaScript新版本引入命名空间概念之前,发扬自立更生精神和创造性是我们程序员的基本义务;-)

实现前提:与Delphi、C#等语言不同,JavaScript中的类并不是对象的定义,事实上JavaScript中并不存在真正的类,这里的类实际上是用函数模拟实现的,而JavaScript中的函数实际上是一个对象,因此在JavaScript中:一个类就是一个对象。这和传统概念概念极为不同,在JavaScript中,创建某个类的实例实际上就是将类(=对象,记住)复制了一份。看到这里,有点设计模式概念的应该就可以看出来了,在JavaScript中,类机制使用了原型(prototype)模式。

实现原理:既然看清楚了类的本质,那么问题就简单了,如果将GEA项目组所有JS类和函数作为属性放在名为GEA的对象里面,然后将GEA对象以属性的方式放在名为Grandsoft对象里面不就可以达到我们的目的,比如Grandsoft.GEA.Person实际上是在Grandsoft对象的属性GEA(也是一个对象)中的类Person(还是一个对象)。

实现非常简单,整个命名空间机制的实现不超过20行代码,分析如下:

// 声明一个全局对象Namespace,用来注册命名空间
Namespace = new Object();
// 全局对象仅仅存在register函数,参数为名称空间全路径,如"Grandsoft.GEA"
Namespace.register = function(fullNS)
{// 将命名空间切成N部分, 比如Grandsoft、GEA等var nsArray = fullNS.split('.');var sEval = "";var sNS = "";for (var i = 0; i < nsArray.length; i++){if (i != 0) sNS += ".";sNS += nsArray[i];// 依次创建构造命名空间对象(假如不存在的话)的语句// 比如先创建Grandsoft,然后创建Grandsoft.GEA,依次下去sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"}if (sEval != "") eval(sEval);
}

  

上面就是在JavaScript中模拟命名空间机制的完整实现,使用方式如下:

// 注册命名空间Grandsoft.GEA, Grandsoft.GCM
Namespace.register("Grandsoft.GEA");
Namespace.register("Grandsoft.GCM");
// 在Grandsoft.GEA命名空间里面声明类Person
Grandsoft.GEA.Person = function(name, age)
{this.name = name;this.age = age;
}
// 给类Person添加一个公共方法show()
Grandsoft.GEA.Person.prototype.show = function()
{alert(this.name + " is " + this.age + " years old!");
}
// 演示如何使用类Person
var p = new Grandsoft.GEA.Person("yanglf", 25);
p.show();

第二种创建命名空间的方法:

eye = {namespace: function() {var a = arguments, o = null, i, j, d, rt;for (i = 0; i < a.length; ++i) {d = a[i].split(".");rt = d[0];eval('if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');for (j = 1; j < d.length; ++j) {o[d[j]] = o[d[j]] || {};o = o[d[j]];}}}
};eye.namespace("eye", "eye.common", "eye.datePicker", "eye.selectCity", "eye.tab","eye.test");
eye.test={//测试命名空间show: function() {return "aaa";}
}
alert(eye.test.show());//命名空间

function ns(pkg){if (!pkg) {return null;}var o = {};var result = o;var arr = pkg.split('.');alert([arr[0]]);o = o[[arr[0]]] = {};var len = arr.length;for (var i = 1; i < len; i++) {o = o[arr[i]] = {};}return result;
}var pkg = ns("com.momo.test");
alert(pkg.com);

转载于:https://www.cnblogs.com/gaojianqi/p/3454004.html

JavaScript创建命名空间相关推荐

  1. 在JavaScript中创建命名空间的几种写法

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

  2. 使用Javascript创建XML文件

    使用Javascript创建XML文件 出处:http://blog.csdn.net/sutao_713/article/details/1908431          在客户端创建XML文件可以 ...

  3. JavaScript创建或填充任意长度的数组

    JavaScript创建或填充任意长度的数组 直接填充法 const arr = [0,0,0]; Array 构造函数 var len = 3; var arr = new Array(len); ...

  4. Google Map API使用详解(十)——使用JavaScript创建地图详解(上)

    在网页MyTest1.html中我们已经使用了JavaScript来创建地图,下面总结一下使用JavaScript创建一个地图的核心步骤: 1.  导入地图API类库. <script src= ...

  5. arcgis api for javascript创建webscene

    arcgis api for javascript创建webscene,核心代码如下: esriConfig.portalUrl = this.config.portal; var scene = n ...

  6. javascript创建类_如何使用JavaScript创建吹气效果

    javascript创建类 Have you ever wondered how you can create a realistic air blowing effect with JavaScri ...

  7. javascript创建类_如何在10分钟内使用JavaScript创建费用管理器

    javascript创建类 by Per Harald Borgen 通过Per Harald Borgen 如何在10分钟内使用JavaScript创建费用管理器 (How to create an ...

  8. Javascript 创建书签小工具 (bilibili视频下载为例)

    书签小工具(Bookmarklets)是一个非常棒的javascript代码小片断伪装成的小应用,它驻留在你的浏览器里并为网页提供额外的功能.这里我们将研究如何从头开始创建一个书签小工具及一些最佳实践 ...

  9. vSphere 7 With K8s系列06:创建命名空间

    vSphere 7 With K8s系列06:创建命名空间 原创 李严省 虚实之路 9月24日 收录于话题 #vSphere with K8s 9个 上一篇文章已经介绍了如何开启vSphere7 wi ...

最新文章

  1. intellij idea 如何一键清除所有断点
  2. [转]机器学习和深度学习资料汇总【01】
  3. hdu4302 set或者线段树
  4. [转]查看事物码相关的数据对象
  5. JS实现省市联动效果
  6. 史上最全基于vue的图片裁剪vue-cropper使用
  7. 02、Windows Phone 套接字(Socket)实战之服务器端设计
  8. 我的世界服务器启动后自动关闭,求解,服务器老师莫名其妙自动关闭,为什么会这样呢?...
  9. matlab m文件参数传递,请问这个.m文件的参数传什么?
  10. jquery mobile页面跳转后js不执行的问题
  11. 免费开源客户关系管理系统
  12. ansys模型导入matlab,ANSYS导入MATLAB
  13. 为什么总是封板又打开涨停_多次涨停多次被打开,涨停板打开然后封住反复
  14. ip_forward 权限不够
  15. X书x-mini-sig_x-mini-mua
  16. tinyint(1)和tinyint(4)的区别和用法
  17. Acwing周赛57-数字操作-(思维+分解质因数)
  18. 聊聊写代码的20个反面教材
  19. UVa 11549 - Calculator Conundrum
  20. World Locking Tools for Unity Sample (二)QR Space Pins

热门文章

  1. vue-cookies使用方法,vue中使用获取cookie
  2. 前端学习(3169):react-hello-react之对props进行限制
  3. 工作397-Wxml
  4. PS教程第八课:新建文件
  5. [vue] v-for循环中key有什么作用?
  6. [css] 解释下 CSS sprites的原理和优缺点分别是什么
  7. 前端学习(1354):集合关联
  8. 前端学习(1266):axios的常见api
  9. 前端学习(578):chrome devtools
  10. mybatis学习(25):分页3 多参数传递(使用map)