?
?
js本身没有实现namespace,但是可以通过自定义来实现,Yahoo公司出品的YUI就有这个功能,你可以在YUI包build/yahoo/yahoo.js中找到相关实现。例如: 在YUI中:执行
1. YAHOO.namespace ("myspace"); 然后你就拥有了YAHOO.myspace这个名字空间,可以进行类似如下的操作:
2. YAHOO.myspace.alertHello=function() {alert("Hello");} 实质上,YUI.namespace相当于建立了一个表项,准确地说是关联数组(associative array)的一项。 我们可以用以下两句代替上面的1、2语句
1)YAHOO["myspace"]=new function(){};
2)YAHOO["myspace"].alertHello=function(){ alert("Hello");};
而且1、2与1)、2)可以交叉组合使用。 不管你使用哪种方式创建自己的名字空间,都有两种方式调用alertHello
a. YAHOO["myspace"].alertHello();
b. YAHOO.myspace.alertHello();
?
?
?
?
1、首先创建一个名为YAHOO的对象
var?YAHOO?=?window.YAHOO?||?{};
2、命名空间YAHOO.namespace方法的实现
??? 首先应该去了解一下什么是命名空间?。
??? 通俗的讲,命名空间就象 java.util.DateTime,为了区别不同类中相同属性或者方法的一种以便达到唯一方法的命名。在YUI中,有YAHOO.util,YAHOO.widget,YAHOO.example等,所有的命名都以YAHOO开头。
??? 下面就是YAHOO.namespace的实现代码:
YAHOO.namespace = function(ns) { //如果参数ns不存在或者为"",在返回null if (!ns || !ns.length) { return null; } //将ns以"."分割成一个数组 var levels = ns.split("."); //nsobj指向空的一个对象,等于 var nsobj = {}; var nsobj = YAHOO; //因为YAHOO对象已经存在,如果第一个命名为"YAHOO",则跳过,从第二个开始 for (var i=(levels[0] == "YAHOO") ? 1 : 0; i<levels.length; ++i) { //所有的命名,都作为YAHOO对象的属性存在 //如果levels[0] = "util",以下实现就相当于 YAHOO["util"] = YAHOO["util"] || {}; //如果levels[1] = "Text",以下实现就相当于 YAHOO["util"]["Text"] = YAHOO["util"]["Text"] || {}; nsobj[levels[i]] = nsobj[levels[i]] || {}; //将最后的对象返回 nsobj = nsobj[levels[i]]; } return nsobj; };?
?
??应用:
/*
实现过程
YAHOO["util"] = {};
*/
YAHOO.namespace("util");
/*
实现过程
YAHOO["widget"] = {}; 先实现 YAHOO.widget 对象
YAHOO["widget"]["Panel"] = {}; 再实现YAHOO.widget.Panel 对象
*/
YAHOO.namespace("widget.Panel");
?
?