转 javascript中的模块和名字空间

转:http://han2000lei.javaeye.com/blog/342810

javascript中的模块和名字空间是不可区分的内容。
    我们定义的每个单独的函数,都是作为全局对象的一个属性。而javascript代码模块化,所必须遵守的最重要的规则就是:避免定义全局变量。因为,当定义一个全局变量时,都有被 其它模块覆盖的危险。所以模块化编码要用如下方式:

Javascript代码 复制代码

  1. var ModuleClass = {};  
  2. ModuleClass.函数名1=function(){  
  3.     函数体;//这个函数看起来是一个对象的方法。对,可以利用对象作为一个名字空间
  4. }   
  5. ModuleClass.函数名2=function(){  
  6.     函数体;  
var ModuleClass = {};
ModuleClass.函数名1=function(){
    函数体;//这个函数看起来是一个对象的方法。对,可以利用对象作为一个名字空间
} 
ModuleClass.函数名2=function(){
    函数体;
}
使用对象作为一个名字空间,将所有的函数及变量都放在其中。这样,即使函数或变量重名( 即不同对象中有相同函数名),它们不在一个名字空间中,这样就不会有被覆盖的危险了。
javascript模块化的第一条规则:一个模块不应该为全局名字空间添加多于一条的标记。解释:上例中的 var ModuleClass = {};其实是在全局名字空间(全局对象)的一个属性。通俗的讲:除了给全局命名空间定义一个模块的命名空间,其它的你一句代码都不要写)
将上面的代码放入一个*.js文件中,以便模块的复用,并且使文件名与名字空间名要一致。假设我们将上面的代码放入ModuleClass.js文件当中(这时,你的名字空间与文件名要一致)。现在又出现了一个新的问题:
    如果名字冲突怎么办?即两个人同时使用了同一个文件名。大家知道,同一目录下是不允许有相同的文件名的,所以可以把这两个文件放入不同的目录下面。如util/MoudleClass.js 和 tools/MoudleClass.js,这时我们文件中的空间就不能跟以前那样了,而是如下面所示:
util/ModuleClass.js代码:

Javascript代码 复制代码

  1. var util;  
  2. if(!util) util = {};//第一级域名
  3. util.ModuleClass = {};//第二级域名
  4. util.ModuleClass.函数名1=function(){  
  5.     函数体;  
  6. }   
  7. util.ModuleClass.函数名2=function(){  
  8.     函数体;  
var util;
if(!util) util = {};//第一级域名
util.ModuleClass = {};//第二级域名
util.ModuleClass.函数名1=function(){
    函数体;
} 
util.ModuleClass.函数名2=function(){
    函数体;
}

tools/ModuleClass.js代码:

Javascript代码 复制代码

  1. var tools;  
  2. if(!tools) tools={};//一级域名
  3. tools.ModuleClass = {};//二级域名
  4. tools.ModuleClass.函数名1=function(){  
  5.     函数体;//这个函数看起来是一个对象的方法。对,可以利用对象作为一个名字空间
  6. }   
  7. tools.ModuleClass.函数名2=function(){  
  8.     函数体;  
var tools;
if(!tools) tools={};//一级域名
tools.ModuleClass = {};//二级域名
tools.ModuleClass.函数名1=function(){
    函数体;//这个函数看起来是一个对象的方法。对,可以利用对象作为一个名字空间
} 
tools.ModuleClass.函数名2=function(){
    函数体;
}

这样就不会出冲突了。当然,有人会问了,要是有人定义的文件夹名也是一样的,那不照样冲突?首先,这样的机率不大,如果真的有,我们可以使用java的命名方式。如下:
命名空间为:com.公司名.项目名.util.空间名;
实际路径为:com/公司目录/项目目录/util/空间名.js
现在我们只以com.util.ModouleClass命名空间为例来看一段代码:

Javascript代码 复制代码

  1. var com;  
  2. if(!com) com={};//如果com不存在,则新生成一个
  3. else if(typeof com!="object"){//如果已存在,但不是一个对象,则抛出一个异常
  4. throw new Error("com already exists and is not an object");  
  5. }  
  6. if(!com.util) com.util={};//如果com.util不存在则新生成一个
  7. else if(typeof com.util!="object"){//如果com存在,但不是一个对象,则抛出一个异常
  8. throw new Error("com.util already exists and is not an object");  
  9. }  
  10. if(!com.util.ModuleClass){//如果com.util.ModuleClass存在,则直接抛出异常
  11. throw new Error("com.util.ModuleClass already exists");  
  12. }  
  13. com.util.ModuleClass = {//在com.util.ModuleClass不存在的情况下,我们才能正常使用在此命名空间下定义的代码
  14.     函数1:function(){ 函数体; },  
  15.     函数2:function(){ 函数体; }  
  16. }; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值