`
wzy1986714
  • 浏览: 11593 次
  • 性别: Icon_minigender_1
  • 来自: 温州
最近访客 更多访客>>
社区版块
存档分类
最新评论

【转载】在javascript中实现命名空间

阅读更多

注:好久没写了,今天把我在公司内网写的文章拷一份,出来露露脸,刚转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();
哈哈,简单吧,这么简单的代码我就不多说了,大家自己看着玩吧,其实我有点懒,呵呵@_@!!!

http://www.cnblogs.com/leafyoung/archive/2006/10/11/526570.html

分享到:
评论

相关推荐

    在JavaScript中实现命名空间

    在引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发...

    javascript简单实现命名空间效果

    以下是一些关于如何在JavaScript中简单实现命名空间效果的知识点: 1. 命名空间定义:在JavaScript中,可以通过创建对象字面量的方式来定义命名空间。例如,可以创建一个全局对象,并在该对象下添加属性,这些属性...

    WebApi返回xml格式时去除命名空间

    然而,在某些场景下,例如与JavaScript或简单的数据解析应用集成时,我们可能希望去掉这些命名空间以简化处理。 要实现这个目标,我们可以自定义一个XML序列化器,继承自`System.Xml.Serialization.XmlSerializer`...

    JavaScript创建命名空间(namespace)的最简实现

    在JavaScript中创建命名空间是为了避免全局变量污染以及更好地组织代码结构。命名空间可以将代码逻辑分隔成一个一个的模块,防止变量名或函数名发生冲突。在给定的文件信息中,提供了两种方法来实现创建命名空间的...

    javascript创建命名空间的5种写法_.docx

    在JavaScript中,使用函数创建命名空间是一种常见的做法。这种方法主要是利用函数来封装命名空间内的成员,包括属性和方法。这种方式的优点在于可以通过原型链的方式进行扩展,使得命名空间更加灵活。 **示例代码**...

    JavaScript 编程引入命名空间的方法

    在 JavaScript 中,没有命名空间的概念,需要使用对象来模拟命名空间。下面是一个基本的命名空间实现方法: 1. 定义一个构造函数,用于创建命名空间: ``` function NameSpace(){} ``` 2. 创建一个命名空间对象: `...

    浅析JavaScript中命名空间namespace模式

    namespace即“命名空间”,也称“名称空间” 、”名字空间”。接下来通过本文给大家介绍JavaScript中命名空间namespace模式的相关知识,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧

    Javascript 命名空间模式

    JavaScript中的命名空间模式是一种组织和管理代码的方式,它旨在解决全局变量污染和命名冲突的问题。在JavaScript这种没有原生命名空间支持的语言中,通过创建一个全局对象并将所有功能附加到这个对象下面,可以模拟...

    TypeScript命名空间 命名空间块化.zip

    在TypeScript中,命名空间(Namespace)是一种组织代码的方式,它提供了一种内聚的、模块化的代码结构,有助于防止全局变量污染,并且方便代码的重用。在本压缩包"命名空间 命名空间块化.zip"中,包含了关于...

    JavaScript中地球上最快的位置空间索引

    标题中的“JavaScript中地球上最快的位置空间索引”指的是在JavaScript环境中实现的一种高效的空间索引技术,用于地图应用。位置空间索引是数据结构和算法领域的一个关键概念,它允许快速查询和操作地理位置相关的...

    大的法师地方js命名空间

    在探讨“大的法师地方js命名空间”这一主题时,我们主要关注的是JavaScript中命名空间的创建与使用。命名空间在编程领域中是一个重要的概念,它主要用于解决代码组织、避免全局变量污染以及模块化等问题。在...

    jquery命名空间模拟

    本篇文章将深入探讨如何在JavaScript中模拟jQuery的命名空间,以实现更有序、更安全的代码组织。 首先,我们需要理解JavaScript的命名空间是如何工作的。由于JavaScript本身没有内置的命名空间机制,我们通常通过...

    javascript自执行函数之伪命名空间封装法.docx

    在JavaScript中,并没有像其他编程语言那样提供原生的命名空间支持。因此,开发者通常会使用对象字面量的方式来模拟命名空间,即所谓的“伪命名空间”。这种方式可以有效地组织代码,减少全局变量的使用,使代码更加...

    javascript创建命名空间的5种写法__1.docx

    JavaScript中的命名空间是一...在JavaScript中选择合适的命名空间创建方式取决于项目需求,如是否需要私有成员、代码的简洁性以及性能考虑。使用命名空间有助于提高代码的组织性和可读性,减少全局变量带来的潜在问题。

    JavaScript 面向对象之命名空间

    在JavaScript中,命名空间的实现较为灵活。一个简单的做法是利用对象字面量(Object Literals)来创建命名空间。对象字面量可以让我们在全局作用域中定义一个对象,并通过点(.)操作符来访问该对象的属性,这些属性...

    Javascript 面向对象 命名空间

    总结来说,JavaScript的面向对象编程中命名空间的创建和使用是一个重要的编程技巧,它可以帮助我们更好地组织代码、避免命名冲突,并且通过模拟的方式实现类似Java或.NET中命名空间的功能。在实际项目开发中,合理...

    javascript高级编程JavaScript.pdf

    在JavaScript中,我们可以使用对象来模拟命名空间。例如,我们创建一个构造函数`NameSpace`,它实际上不执行任何操作,但可以用来创建一个新的命名空间: ```javascript function NameSpace() {} ``` 然后,我们...

    javascript模拟命名空间

    然而在JavaScript中,直到ES6(ECMAScript 2015)版本之前,并没有直接支持命名空间的特性。这导致了JavaScript开发者需要寻找其它方法来模拟命名空间,以解决作用域污染和全局变量冲突的问题。 利用JavaScript的...

Global site tag (gtag.js) - Google Analytics