/*
构建命名空间对象 该对象是唯一全局对象
主要用于构建命名空间并注册至命名空间中。
*/
var NameSpace = new Object();
//全局对象仅仅存在register函数,参数为名称空间全路径。
NameSpace.register=function(nameSpaceName){
//使用.切割命名空间名称
var nsArray=nameSpaceName.split('.');
var sEval="";
var sNS="";
//循环命名空间的各个部分依次构建命名空间的各个部分
for(var i=0;i<nsArray.length;i++){
if(i!=0)
sNS+=".";
sNS+=nsArray[i];
sEval+="if (typeof("+sNS+")=='undefined')"+
"{ "+sNS+"=new Object(); }";
//eval是将参数作为代码来执行的。
continue;
}
if(sEval.length>0)
eval(sEval);
}
// 注册命名空间 如: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;
if(typeof(Grandsoft.GEA._initalized)=="undefined")
{
// 给类Person添加一个公共方法show()
Grandsoft.GEA.Person.prototype.show = function()
{
alert(this.name + " is " + this.age + " years old!");
}
}
Grandsoft.GEA._initalized=1;
}
// 演示如何使用类Person
var p = new Grandsoft.GEA.Person("yanglf", 25);
p.show();
YahooUI里也实现在这个功能,代码如下:
var YAHOO = function() {
return {
/**
* Yahoo presentation platform utils namespace
*/
util: {},
/**
* Yahoo presentation platform widgets namespace
*/
widget: {},
/**
* Yahoo presentation platform examples namespace
*/
example: {},
/**
* Returns the namespace specified and creates it if it doesn 't exist
*
* YAHOO.namespace( "property.package ");
* YAHOO.namespace( "YAHOO.property.package ");
*
* Either of the above would create YAHOO.property, then
* YAHOO.property.package
*
* @param {String} sNameSpace String representation of the desired
* namespace
* @return {Object} A reference to the namespace object
*/
namespace: function( sNameSpace ) {
if (!sNameSpace || !sNameSpace.length) {
return null;
}
var levels = sNameSpace.split( ". ");
var currentNS = YAHOO;
// YAHOO is implied, so it is ignored if it is included
for (var i=(levels[0] == "YAHOO ") ? 1 : 0; i <levels.length; ++i) {
currentNS[levels[i]] = currentNS[levels[i]] || {};
currentNS = currentNS[levels[i]];
}
return currentNS;
}
};
} ();
YAHOO.namespace实际上就是这个
<script language= "javascript ">
function _using(ns)
{
if (!ns || !ns.length)
{
return null;
}
var nsParts = ns.split( ". ");
var root = window;
for(var i=0; i <nsParts.length; i++)
{
root[nsParts[i]] = root[nsParts[i]] || {};
root = root[nsParts[i]];
}
return root;
}
var com={
f : function() {
alert( "com function ");
},
util : {
f : function() {
alert( "com.util function ");
}
}
};
var b=_using( "com ");
b.f();
var c=_using( "com.util ");
c.f();
</script>