Javascript的命名空间库----namespace.js
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:editor 阅读 302
命名空间的好处已经耳熟能详,但是JS中并没有原生态支持命名空间,这个库就是为js提供命名空间的功能。github:https://github.com/hirokidaichi/namespace-

命名空间的好处已经耳熟能详,但是JS中并没有原生态支持命名空间,这个库就是为js提供命名空间的功能。

github:https://github.com/hirokidaichi/namespace-js

定义Namespace对象:

var Namespace

现在来具体看一下Namespace对象的定义,它是一个NamespaceDefinition对象。该对象是一个函数对象(NamespaceDefinition对象的构造函数,如果不给参数的话就默认生成一个main的命名空间),还有三个属性,Object,Definition,Proc。其值依次为NamespaceObjectFactory,NamespaceDefinition,createProcedure函数对象类。

 

  
  

 

NamespaceObjectFactory:根据fqn生成NamespaceObject对象。

NamespaceObjectFactory对象只有一个create方法,参数就是命名空间的名字(Fully Qualified Name)。该方法有一个闭包环境,该环境里有一个cache变量用于缓存所有生成的NamespaceObject对象。

一个NamespaceObject对象包含有三个属性,stash(记录当前namespace),fqn(namespace名字),proc(createProcedure对象)。方法包括:enqueue,call,valueof,merge,getStash,getExport

 

  

NamespaceDefinition:

该对象包括5个属性,namespaceObject,requires,useList,stash,defineCallback。并提供了相关的方法:use,_mergeStashWithNS,loadImport,define,getStash,valueOf,apply

该对象是namespace库的核心,它提供了所有需要的方法。

初始化的时候,在NamespaceObject的proc的steps队列里追加一个函数对象,该函数将调用apply方法。

 

createProcedure:该对象是一个函数对象,返回Procedure对象的next方法的结果。

Procedure:

Procedure对象有三个属性:state,steps,_status(默认为init)。提供一下几种方法:next,isRunnig,enqueue,dequeue,call,_invoke。

 

 

   

追加定义Namespace支持的方法:

Namespace.use

Namespace.fromInternal

Namespace.GET

Namespace.fromExternal

   

具体看一个例子:

     

1:Namespace('logtest') => new NamespaceDefinition(NamespaceObjectFactory.create('logtest'))

    即生成一个NamespaceDefinition对象,该对象是由NamespaceObject对象来初始化的,该对象同时还有三个属性,Object,Definition,Proc。其值依次为             NamespaceObjectFactory,NamespaceDefinition,createProcedure函数对象类。Namespace('logtest') 返回的结果就是生成的NamespaceDefinition对象,然后调用其define方法,初始化defineCallback。此时仅仅是定义,不做具体的动作。

 

 

 

2:使用之前定义的namespace里面的对象,Namespace.use() => Namespace().use() => Namespace('main').use()。调用use的时候初始化requires数组。

 

 

 

 

3:调用main的apply方法。看一下具体的apply方法

    
  取出requires数组里面的对象生成Proc对象,并把该requires数组里的对象入队列steps中,还有nsDef.defineCallback也入队列(此例中为undefined),调用Proc的call方法。第一个参数是nsDef,第二个参数是回调函数。
  

具体使用方法:

  在定义Namespace的时候,所有的定义放在define里面,并且以匿名函数的形式定义。
  function (ns) {
    // 具体的实现
    // 定义对外公开的对象,外部在use该nsName之后,就可以通过ns.nsName.key()来调用它
    ns.provide({ key : value});
  }

使用namespace.js的好处,所有的定义都是在需要的时候才开始执行的,也就是在具体使用的时候才开始解析定义。

 

ps:具体内部调用关系还是没有弄明白,今后有时间再整理,这篇太乱了。

 

联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2