标签:
在小规模的脚本开发中,有时候并不值得去引用命名空间,因为会带来某种程度的复杂性;但是当在同一个网页里引入10多个js文件之后,各js中的同 名函数就很容易冲突了。比如xxx库里写了个addCssStyle方法,yyy类库里也写了个addCssStyle方法,而这两个方法的具体实现又有 一定差别。那么同时引用这两个组件的时候,函数冲突之后导致页面效果发生变化,调试和修改都是非常痛苦的,如果为了避免冲突,而放弃引用一些优秀的组件, 那更是让人郁闷的事情。为此,在封装javascript组件库的时候,请使用命名空间来避免冲突。将所有的方法和变量都要按包名,类名的方式来写。(这个时候写代码的感觉和封装java的util方法一样方便,呵呵)
所以,请记住:请为你封装的JavaScript库加上命名空间以提高代码重用性。
但是JavaScript原生并不支持命名空间,需要变通来实现。
在 JavaScript中,所有的对象(或者称类型,例如Boolean,Array,Function)都可以认为是一个关联数组。关联数组中的对象可以 使用点(.)进行引用,这样我们可以利用关联数组变相地实现命名空间。首先声明一个关联数组作为根,因为页面声明的对象都是window这个变量的成员, 所以一般命名空间的实现都以window为根。当向window申请a.b.c的命名空间时,首先在window中查看是否存在a这个成员,如果没有则在 window下新建一个名为a的空关联数组,如果已经存在a,则继续在window.a中查看b是否存在,以此类推。下面分别是Atlas和YUI中的实 现方法。
//Atlas命名空间的实现方法
Function.registerNamespace =function(namespacePath){
//以window为根
var rootObject =window;
//对命名空间路径拆分成数组
var namespaceParts =namespacePath.split(‘.‘);
for (var i =0;i <namespaceParts.length;i++) {
var currentPart =namespaceParts[i];
//如果当前命名空间下不存在,则新建一个Object对象,等效于一个关联数组。
if (!rootObject[currentPart]) {
rootObject[currentPart]=new Object();
}
rootObject =rootObject[currentPart];
}
}
标签:
原文地址:http://www.cnblogs.com/alisayuan/p/4735791.html