码迷,mamicode.com
首页 > Web开发 > 详细

js命名空间

时间:2016-01-06 12:08:09      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

在小规模的脚本开发中,有时候并不值得去引用命名空间,因为会带来某种程度的复杂性;但是当在同一个网页里引入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];

}

}

js命名空间

标签:

原文地址:http://www.cnblogs.com/alisayuan/p/4735791.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!