JavaScript创建命名空间

     引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,呵呵)。命名空间的引入相当程度上解决了这个问题,当然,如果你使用的命名空间和其他公司不幸一样,而对方又是微软、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

String类的方法

public class A {public static void main(String[] args) {// TODO Auto-generated method stubStringBuilder sbnew StringBuilder();//长度可变的字符串sb//可以往字符串里添加任何字符串的方法。sb.append("haha");sb.append(s).append("jjjxxx");//链…

android c聊天功能,Android实现简单C/S聊天室应用

Android的网络应用&#xff1a;简单的C/S聊天室&#xff0c;供大家参考&#xff0c;具体内容如下服务器端&#xff1a;提供两个类创建ServerSocket监听的主类:MyServer.java负责处理每个Socket通信的线程类:ServerThread.java客户端&#xff1a;是一个Android应用程序>Multi…

ID生成策略(一)

ID生成策略&#xff1a;主键手工设定很不方便&#xff0c;在我们实际工作中在MySQL里面用自增字段auto increment&#xff0c;在oracel中一般用sequence。所以把表建成auto increment&#xff0c;对于类里面对象的对应的值就不能指定了&#xff0c;得靠程序或数据库自动生成&am…

android tabpageindicator 参数,Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)...

Android现在实现Tab类型的界面方式越来越多&#xff0c;今天就把常见的实现方式给大家来个总结。目前写了&#xff1a;1、传统的ViewPager实现2、FragmentManagerFragment实现3、ViewPagerFragmentPagerAdapter实现4、TabPageIndicatorViewPagerFragmentPagerAdapter1、传统的V…

冒泡与选择排序

public class B {public static void main(String[] args) {// 冒泡排序int[] arr{1,2,34,54,5,3};//从小到大的顺序for (int j 0; j < arr.length-1; j) {//得到4个maxfor (int i 0; i < arr.length-1; i) {//内循环得到一个maxif (arr[i]>arr[i1]) {int carr[i];a…

基于visual Studio2013解决C语言竞赛题之0304整除数

&#xfeff;&#xfeff;&#xfeff;&#xfeff;题目解决代码及点评按照题目要求&#xff0c;判断数值对3和5取模的结果&#xff0c;是否为0#include <stdio.h> #include <stdlib.h> void main() {int a;printf("please input a\n");scanf_s("%d…

android驱动代码,GitHub - rumengsuifeng/AndroidDrivers: Android驱动的代码

1. 创建hardware目录&#xff0c;在该目录下创建HardCor.java文件(参考HelloWorldActivity.java文件)2. 在build.gradle(app路径)文件中添加指定so文件的目录&#xff0c;so文件的源文件是C语言编写的&#xff0c;可以放在任意一个目录&#xff0c;它就是JNI文件3. 如果工程里a…

html的路径

##html的路径 1.绝对路径&#xff1a;在不同的盘符下或者不在同一个盘符下的不同文件夹下的引用 <!--相对路径&#xff1a;1.同一个目录的.html文件和图片&#xff0c;直接引用图片文件名--> <!--2.同一个目录的.html文件和在其目录的文件夹里的图片&#xff0c;要引…

kendo-ui学习笔记——题记

1.Kendo UI基于最新技术HTML5、CSS3和JavaScript标准设计开发。2.官方网址&#xff1a;http://www.kendoui.com/3.API网上查阅英文版网址&#xff1a;http://docs.kendoui.com/api/dataviz/barcode正在使用kendo ui中HTML库进行项目开发&#xff0c;期间遇到过不少的问题&#…

搜狗输入法Android5.1,ESXI 服务器断电之后一直 LOADING MODULE IPMI_SI_DRV 的解决办法...

今日家中忽然断电&#xff0c;之后 ESXi 服务器就一直疯狂转&#xff0c;连接显示器&#xff0c;发现原来一直没有启动。停留在ESXi Loading module ipmi_si_drv 是ipmi_si_drv模块没有加载。于是各种找原因&#xff0c;google&#xff0c;看到了一个帖子如下&#xff0c;需要关…

利用CSS、JavaScript及Ajax实现图片预加载的三大方法及优缺点分析

预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中&#xff0c;访问者便可顺利地在你的网站上冲浪&#xff0c;并享受到极快的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利&#xff0c;它保证了图片快速、无缝地发布&#xff0c;也可帮助用户在…

html表格

<html><head><title>easy</title></head><body><!--超链接--><a href"http://www.baidu.com" target"_self">百度</a><!--在当前页面打开百度--><a href"http://www.baidu.com"…

jquery中邮箱地址 URL网站地址正则验证实例代码

jquery中邮箱地址 URL网站地址正则验证实例代码 QQ网站有一个网站举报的功能&#xff0c;看了一些js代码觉得写得很不错&#xff0c;我就拿下来了&#xff0c;下面是一个email验证与url网址验证js代码&#xff0c;分享给大家 email地址验证 复制代码代码如下:function checkEma…

html鼠标悬停位置,html – 当我将鼠标悬停在其上时,我想隐藏图像并在其位置显示文本...

不确定我是否理解你想要的东西,但这对你有用吗&#xff1f;初始案例#wrapper {position: relative;}.text {opacity: 0;position: absolute;bottom: 0;}.hover:hover {opacity: 0;}.hover:hover .text {opacity: 1;}text​扩展案例#wrapper {display: inline-block;position: …

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)

1.进程与线程定义 进程包含线程&#xff0c;如一个百度网盘进程&#xff0c;该进程的线程可以有上传&#xff0c;下载。 2.创建线程的三种方式 方式1-继承Thread类 方式2-实现Runnabled接口 1.常规写法 2.匿名内部类写法 方式3-实现Callable接口 示例代码&#xff1a; f1.get…

html表单总结

<html><head><title>表单总结</title></head><body background"C:\Users\Pictures\web\cute1.jpg"><form action"C.html" method"post" target"_self">Name:<input type"text"…

怎么批量修改html文件后缀,怎么批量修改文件后缀

问题是这样的&#xff0c;有一个web项目&#xff0c;其中包含很多以html为后缀的文件(分别在不同目录下)&#xff0c;如今想把他们的后缀改为 jsp&#xff0c;如果手工改的确比较累人&#xff0c;我比较喜欢偷懒&#xff0c;于是写个小程序帮我干&#xff0c;这样以后遇到此类问…

Analysis of Cloud Computing Architectures阅读笔记--提出了Screen虚拟化方法

作者&#xff1a;Ritika Mittal, Kritika Soni 单位&#xff1a;来自印度的一个私立学校,Manav Rachna International University 文章大意&#xff1a; 分析了云计算的一些基本知识&#xff0c;分析了CloneCloud&#xff0c;它认为CloneCloud的缺点在于处理延迟上&#xff0c;…