在JavaScript中实现命名空间

 更新时间:2006年11月23日 00:00:00   作者:  
注:好久没写了,今天把我在公司内网写的文章拷一份,出来露露脸,刚转Web开发,所以开始学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(); 
哈哈,简单吧,这么简单的代码我就不多说了,大家自己看着玩吧,其实我有点懒,呵呵@_@!!!

相关文章

  • javascript实现焦点滚动图效果 具体方法

    javascript实现焦点滚动图效果 具体方法

    以下JS代码实现了焦点滚动图的效果方法,有需要的朋友可以参考一下
    2013-06-06
  • JS表格组件神器bootstrap table详解(强化版)

    JS表格组件神器bootstrap table详解(强化版)

    这篇文章主要以实例的方式为大家再次介绍了JS表格组件神器bootstrap table,bootstrap table界面采用扁平化的风格,用户体验比较好,更好兼容各种客户端,需要了解更多bootstrap table的朋友可以参考下
    2016-05-05
  • Json Web Token在前后端实践思考分析

    Json Web Token在前后端实践思考分析

    这篇文章主要为大家介绍了Json Web Token在前后端实践思考分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • input点击后placeholder中的提示消息消失

    input点击后placeholder中的提示消息消失

    placeholder属性是HTML5 中为input添加的。在input上提供一个占位符,文字形式展示输入字段预期值的提示信息(hint),该字段会在输入为空时显示
    2016-01-01
  • js从数组中删除指定值(不是指定位置)的元素实现代码

    js从数组中删除指定值(不是指定位置)的元素实现代码

    下面小编就为大家带来一篇js从数组中删除指定值(不是指定位置)的元素实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • TypeScript中Getter/Setter用法详解

    TypeScript中Getter/Setter用法详解

    getter使我们能够将属性绑定到在访问属性时调用的函数,而setter将属性绑定到在尝试设置属性时调用的函数,下面就跟随小编来看看TypeScript中Getter/Setter的用法吧
    2024-10-10
  • javascript代码简写的几种常用方式汇总

    javascript代码简写的几种常用方式汇总

    任何一种编程语言的简写小技巧都是为了帮助你写出更简洁、更完善的代码,让你用更少的编码实现你的需求,这篇文章主要给大家介绍了关于javascript代码简写的几种常用方式,需要的朋友可以参考下
    2021-08-08
  • Openlayers实现地图的基本操作

    Openlayers实现地图的基本操作

    这篇文章主要为大家详细介绍了Openlayers实现地图的基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • ant-design-pro使用qiankun微服务配置动态主题色的问题

    ant-design-pro使用qiankun微服务配置动态主题色的问题

    这篇文章主要介绍了ant-design-pro使用qiankun微服务配置动态主题色,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • js 连续赋值的简单实现

    js 连续赋值的简单实现

    下面小编就为大家带来一篇js 连续赋值的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06

最新评论