在引入命名空间之前,一个令开发人员头疼的问题
就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在
当今协作开发相当盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的
话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,呵呵)。命名空间的引入相当程度上解决了这个问题,当然,如果你使用的命名空间和其他公司不幸
一样,而对方又是微软、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();
分享到:
相关推荐
以下是一些实现命名空间的常见方法: 1. **对象嵌套**: 在给定的示例中,`com.anyjava` 是一个命名空间,它通过对象嵌套的方式创建。`com` 是顶级命名空间,`anyjava` 是其下的子命名空间。通过这种方式,可以将...
以下是一些关于如何在JavaScript中简单实现命名空间效果的知识点: 1. 命名空间定义:在JavaScript中,可以通过创建对象字面量的方式来定义命名空间。例如,可以创建一个全局对象,并在该对象下添加属性,这些属性...
然而,在某些场景下,例如与JavaScript或简单的数据解析应用集成时,我们可能希望去掉这些命名空间以简化处理。 要实现这个目标,我们可以自定义一个XML序列化器,继承自`System.Xml.Serialization.XmlSerializer`...
然而,JavaScript并没有原生支持命名空间,但它可以通过模拟实现,常见的方法有对象字面量、立即执行函数表达式(IIFE)和模块化(如CommonJS、ES6模块)等。 1. 对象字面量:这是一种创建命名空间的简单方式,通过...
### JavaScript自执行函数之伪命名空间封装法 #### 一、引言 在现代Web开发中,JavaScript作为一种广泛使用的客户端脚本语言,其作用日益显著。为了提高代码的可维护性和安全性,开发者们不断探索新的编码技巧。...
本篇文章将深入探讨如何在JavaScript中模拟jQuery的命名空间,以实现更有序、更安全的代码组织。 首先,我们需要理解JavaScript的命名空间是如何工作的。由于JavaScript本身没有内置的命名空间机制,我们通常通过...
在给定的部分内容中,作者通过一个简单的例子展示了如何在JavaScript中创建和使用命名空间。首先,定义了一个名为`My`的空对象作为根命名空间,然后在其下创建了`Util`子命名空间。接下来,定义了一个名为`namespace...
总结来说,JavaScript的面向对象编程中命名空间的创建和使用是一个重要的编程技巧,它可以帮助我们更好地组织代码、避免命名冲突,并且通过模拟的方式实现类似Java或.NET中命名空间的功能。在实际项目开发中,合理...
需要注意的是,虽然使用eval可以实现命名空间的动态创建,但在实际开发中应尽量避免使用eval,因为eval执行的代码安全性难以保证,它可能导致代码注入等安全问题。所以,在现代JavaScript开发实践中,通常会推荐使用...
本文将深入探讨“jQuery自定义插件命名空间问题”,这涉及到如何优雅地组织和管理自定义的jQuery扩展,以避免冲突并保持代码的可维护性。 首先,了解jQuery插件的基本结构至关重要。一个简单的jQuery插件通常会定义...
综上所述,js-qname库通过其丰富的功能和简单易用的接口,为JavaScript开发者处理XML文档和命名空间问题提供了强大支持。无论是解析XML,操作DOM,还是与Web服务交互,这个库都能显著提高代码的效率和可读性。通过...
JavaScript中的命名空间可以通过创建对象来实现,无论是使用全局对象window还是自定义的对象。 首先,顶级命名空间的创建和使用是一种常见的做法,它通常是直接在window对象上挂载属性。通常的做法是检查该属性是否...
总之,这段代码展示了如何在 JavaScript 中实现类的模拟、命名空间的创建以及如何组织代码以提高可读性和可维护性。虽然不是现代前端开发的最佳实践,但对于理解 JavaScript 的基本概念和代码组织策略仍然很有帮助。
本文中介绍的是一种利用对象字面量和闭包特性实现命名空间的简单方法。该方法的优点在于其简单性和高效性,缺点可能在于不够直观,并且有可能引起全局变量污染。具体实现如下: 首先,通过声明一个空对象来创建全局...
上述代码展示了如何通过简单的JavaScript代码来模拟命名空间。 在JavaScript中实现继承,通常是通过原型链和构造函数来完成的。可以使用`Object.create()`方法来创建一个新对象,使新对象的`__proto__`指向另一个...
通过一个简单的命名空间标识符,就可以在任何时候将指定的事件从元素上解绑,这对于编写和维护大型JavaScript应用来说是一个非常有用的技巧。在使用jQuery进行前端开发时,合理运用事件绑定和命名空间,可以显著提高...
ClearScript的核心就是这样的引擎,它支持多种不同的JavaScript实现,包括Microsoft的JScript和V8引擎,后者是由Google开发的一个高性能JavaScript引擎,被广泛应用于Chrome浏览器。 ClearScript的主要功能和特点...