模块是任何强大应用程序中不可或缺的一部分,它通常能帮助我们清晰地分离和组织项目中的代码单元。
js中实现模块的方法:
1.对象字面量表示法
2.Module模式
3.AMD模块
4.CommonJS模块
5.ECMAScript Harmony 模块
对象字面量
对象字面量不需要使用new运算符进行实例化,但不能用在一个语句的开头,因为开始的可能被解读为一个块的开始,在对象的外部,新成员可以使用如下赋值语句添加到对象字面量上,myModule.property = “someValue”。
var myModule = { myProperty:"someValue", myConfig:{ useCaching:true, language:"en" }, //基本方法 myMethod:function(){ //... }, //根据当前配置输出信息 myMethod2:function(){ console.log("Caching is:"+(this.myConfing.useCaching) ? "enabled":"disabled"); }, //重写当前配置 myMethod3:function(newConfig) { if(typeof newConfig ==="object"){ this.myConfig = newConfig; console.log(this.myConfig.language); } },};myModule.myMethod3({language:"fr",usecaching:false})
使用对象字面量有助于封装和组织代码。
在javascript中,Module模式用于进一步模拟类的概念,通过这种方式,能够使一个单独的对象拥有公有/私有方法和变量,从而屏蔽来自全局作用域的特殊部分。
module模式使用了闭包封装“私有”状态和组织。它提供了一种包装混合公有/私有方法和变量的方式,防止起泄露至全局作用域,并与别的开发人员的接口发生冲突。通过该模式,只需要返回一个公有的API,而其他的一切则都维持在私有闭包里。
在module模式内,由于闭包的存在,声明变量和方法只在该模式内部可用,但在返回对象上定义的变量和方法,则对外部使用者都是可用的
module模式的实现
var testModule = (function(){ var counter = 0; return { incrementCounter:function(){ return ++counter; }, resetCounter:function(){ console.log("counter value prior to reset" + counter); counter = 0; } }})();//增加计数器testModule.incrementCounter();//检查计数器值并重置testModule.resetCounter();
代码的其他部分是无法直接读取incrementCounter()和resetCounter()。counter变量实际上是完全与全局作用域隔离的,因此它表现的就像是一个私有变量,它的存在被局限于模块的闭包内,因为唯一能够访问其作用域的代码就是这两个函数。上述方法进行了有效的命名空间设置,所以在测试代码中,所有的调用都需要加上前缀。
//包含命名空间、公有、和私有变量的Module模式var myNamspace = (function(){ //私有计数器变量 var myPrivateVar = 0; //记录素有参数的私有函数 var myPrivateMethod = function(foo){ console.log(foo); }; return { //公有变量 muPublicVar:"foo", //调用私有变量和方法的公有函数 myPublicFunction:function(bar){ myPrivateVar++; myPrivateMethod(bar); } }})();
新闻热点
疑难解答
图片精选