原文:http://dev.firnow.com/course/3_program/java/javashl/20081128/152797.html
引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,呵呵)。命名空间的引入相当程度上解决了这个问题,当然,如果你使用的命名空间和其他公司不幸一样,而对方又是微软、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 Namespace Initiative是一个旨在解决JavaScript代码组织和避免全局变量污染问题的开源项目。在JavaScript编程中,随着代码量的增加,全局变量的使用容易导致命名冲突,因此命名空间成为了一种有效的解决...
JavaScript 中的命名空间这是一个小函数,它为您在 JavaScript 中声明和使用命名空间提供了一个很好的、简单的语法。...用法使用 namespace.js 非常简单。 命名空间声明如下所示: namespace("My.Namespac
在JavaScript中,命名空间(namespace)是一种组织代码的方式,用于解决由于全局变量过多或第三方库引入导致的命名冲突问题。由于JavaScript没有内置的命名空间或包管理机制,开发者通常通过模拟实现这一概念。在...
JavaScript中的命名空间是一个重要的概念,其主要目的是为了避免命名冲突,即在不同的作用域或不同的模块中定义了同名的函数、对象或变量时,能够将它们区分开来。在传统的JavaScript开发中,全局变量和函数容易导致...
1. `src`目录:源代码文件,可能是JavaScript或TypeScript,实现了命名空间的定义和相关功能。 2. `dist`目录:编译后的可发布的文件,通常包括.min.js版本,供生产环境使用。 3. `README.md`:库的使用说明和安装...
命名空间.js 一个简单的 JavaScript 命名空间函数。背景为了将代码组织成逻辑组,Java 和 C# 等编程语言具有namespace的概念。 JavaScript 没有命名空间的概念——但可以创建类似的功能。 Namespace.js 就是这样做的...
js-namespace-rails可以通过使用它的方法来命名空间并根据哪个Rails控制器动作处于活动状态来选择性地执行某些JavaScript,从而解决此问题。 安装 将此行添加到您的应用程序的Gemfile中: gem 'js-namespace-rails...
### Ext JS 2.1 核心 API 详解 #### 1. `addBehaviors(Object obj):void` 此方法用于向指定的 DOM 元素添加事件监听器。它接受一个对象作为参数,其中键为事件选择器(selector),值为对应的事件处理函数。 **...
之前看到网易还是新浪还是什么什么网站来着,也是用类似这种东西的,当时对js只是九牛一毛的水平,当场被吓傻了。但这次,我打算亲自分析下,以后在看到就不会迷茫了。 代码如下://调用例子:bradio.namespace(...
Namespacer.js 一个用于在浏览器中创建名称空间的简单库 // Create the namespace Namespacer ( 'foo.bar.baz' ) // Use the namespace foo . bar . baz = { a : 1 } // Pass an object directly ...
当您在 node.js 中需要模块时,您需要包含文件的路径,这可能会导致文件顶部的“../../”路径混乱,但也可能意味着移动/重命名文件会破坏相关模块。 为了避免这个问题,命名空间的新概念允许您以一种与磁盘上的目录...
JavaScript中的命名空间(namespace)模式是一种组织代码结构的策略,特别是在使用多个库或框架时,避免全局变量冲突和提高代码可维护性。由于JavaScript没有像C#或Java那样的内置命名空间支持,开发者需要通过...
JavaScript是一种广泛使用的编程...尽管现代的JavaScript版本(ES6及以后)已经原生支持模块化和导入导出语句,但在更早期的JavaScript版本中,命名空间库如`namespace.js`在当时的JavaScript项目中扮演了重要的角色。
Koa-Static-Namespace 是一个专门为 Node.js 的 Koa 框架设计的中间件,它的主要功能是为 Koa 应用程序提供静态资源服务,特别是针对具有命名空间(namespace)需求的场景。在 Koa 中,中间件是一种强大的工具,它...
安装`koa-static-namespace`非常简单,只需要使用npm(Node.js的包管理器)进行安装: ```bash npm install koa-static-namespace ``` 然后在你的Koa应用中引入并使用它: ```javascript const Koa = require('...
JavaScript中的面向对象编程是解决大型项目中代码组织和管理的关键技术。在小规模的应用中,简单地使用函数可能已经足够,但随着项目复杂性的增加,尤其是对于那些注重用户体验的社交网络服务(SNS)等大型网站,...
$ npm install postcss-selector-namespace 用法 var postcss = require ( 'postcss' ) var selectorNamespace = require ( 'postcss-selector-namespace' ) var output = postcss ( ) . use ( selectorNamespace ...