js命名空间(摘录)

/*
构建命名空间对象  该对象是唯一全局对象
主要用于构建命名空间并注册至命名空间中。
*/
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>

原文地址:https://www.cnblogs.com/beijia/p/namespace.html