码迷,mamicode.com
首页 > 编程语言 > 详细

javascript设计模式-module(模块)模式

时间:2016-08-19 11:25:04      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

模块是任何强大应用程序中不可或缺的一部分,它通常能帮助我们清晰地分离和组织项目中的代码单元。

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);

        }
    }
})();

Module模式的还是存在一定的不足:
1. 由于我们访问公有和私有成员的方式不同,当我们想改变可见性时,实际上我们必须修改每一个曾经使用过该成员的存在。
2. 我们无法访问那些之后在方法里面添加的私有成员,
3. 无法为私有成员创建自动化单元测试,bug需要修正补丁时会增加额外的复杂性。
4. 开发人员无法轻易地扩展私有方法

javascript设计模式-module(模块)模式

标签:

原文地址:http://blog.csdn.net/lfcss/article/details/52247398

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!