/*
Modelu模式
优点:效率高,代码少,加载速度快,松耦合允许并行加载,提升下载速度
缺点:初始化时间久一点
*/
//一、基础用法
var calculate = function (eq) {
//私有成员
var eqCtl = document.getElementById(eq);
return {
//暴露公开成员
add: function (x, y) {
var val = x + y;
eqCtl.innerHTML = val;
}
}
}
//使用方式
//缺点:每次调用都要new,copy多份
var calculator = new calculate();
calculator.add(2, 2); //二、匿名闭包 ?闭包用途和场景
(function () {
//--所有变量和fucntion都在此声明,并且作用域也只在这个匿名闭包
//--依然可以访问外部全局对象
}()); //()匿名函数自己执行,不用new //三、引用全局变量
/*
隐式全局变量:无论一个变量是否使用,js会反向遍历作用域链来找到var,如果没找到var,则假定该变量为全局
*/
(function ($, yahoo) {
//这里使用了全局的jQuery和yahoo
}(jQuery, yahoo)); //声明全局变量,module模式
var blogModule = (function () {
var my = {}, privateName = '博客园';
function privateAddToTopic(data) {
//内部处理代码
}
my.Name = privateName;
my.AddTopic = function (data) {
privateAddToTopic(data);
};
return my;
}()); //三、高级用法 易于扩展结构
//扩展添加一个函数
var blogModule = (function (my) {
my.AddTopic = function () { }
return my;
}(blogModule)); //--缺点:必须先声明blogModule
//松耦合扩展,加载顺序不固定,缺点:不一定能用所有属性和函数
var blogModule = (function (my) {
return my;
}(blogModule || {}));
//紧耦合扩展
//重载
var blogModule = (function (my) {
var oldAdd = my.AddTopic;
my.AddTopic = function () {
//重载,依然可以用oldAdd调用旧的方法
}
return my;
}(blogModule));
//克隆和继承
var blogModule = (function (old) {
var my = {},
key;
for (key in old) {
if (old.hasOwnProperty(key)) {
my[key] = old[key];
}
} var oldAdd = old.AddTopic;
my.AddTopic = function () { }
return my;
}(blogModule)); //--非继承,只是同个对象多个引用
//跨文件共享私有对象
var blogModule = (function (my) {
var _private = my._private = my._private || {},
_seal = my._seal = my._seal || function () {
delete my._private;
delete my._seal;
delete my._unseal;
},
_unseal = my._unseal = my._unseal || function () {
my._private = _private;
my._seal = _seal;
my._unseal = _unseal;
}
return my;
}(blogModule || {}));
//子模块
blogModule.CommentSubModule = (function () {
var my = {};
return my;
}());
/*
创建一个立即执行的匿名函数表达式
return一个变量,其中这个变量包含你要暴露的属性
返回这个变量将赋值给counter,而不是外部声明的function自身
*/
var counter = (function () {
var i = 0;
return {
get: function () {
return i;
},
set: function (val) {
i = val;
},
increment: function () {
return ++i;
}
};
}());
//counter是一个待有过个属性的对象
counter.get();
counter.set(3);
counter.increment();
counter.increment();
counter.i;//undefined
i;//引用错误

Module模式 - 深入了解Javascript的更多相关文章

  1. javascript --- 设计模式之Module模式

    基本用法 先看一下最简单的一个实现,代码如下: var Calculator = function(){ // 这里可以声明私有成员 var eqCtrl = document.getElement( ...

  2. 【JavaScript】设计模式-module模式及其改进

    写在前面 编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方 说到这里...... <head first设计模式>里有一篇文章, ...

  3. javascript闭包(Module模式)的用途和高级使用方式

    javascript闭包(Module模式)的用途和高级使用方式 javascript闭包的用途:1. 匿名自执行函数:或者可以理解为,避免污染全局变量2. 缓存:源于闭包的核心特性便是保存状态,应用 ...

  4. <深入理解JavaScript>学习笔记(3)_全面解析Module模式

    简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 模块化,可 ...

  5. 深入理解JavaScript系列(3):全面解析Module模式

    简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 模块化,可 ...

  6. 【设计模式】module模式&&Revealing module (揭示)模式

    写在前面 <head first设计模式>里有一篇文章,是说使用模式的心智, 1.初学者"心智" :"我要为HELLO WORLD找个模式" 2.中 ...

  7. 设计模式之module模式及其改进

    写在前面 编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方 <head first设计模式>里有一篇文章,是说使用模式的心智, ...

  8. Module 模式 以及 揭示模式。

    ---恢复内容开始--- Module模式 : 在传统软件工程中为类提供私有和公有封装的方法. 在js中: Module 模式 使用闭包封装 私有状态和组织. 该模式,返回一个公有的API,而其他的一 ...

  9. 自调用匿名函数和js的Module模式

    编写自调用匿名函数的结构一般如下: :(function( window, undefined ) { // your code })(window); 传入的参数window,和参数列表中的unde ...

随机推荐

  1. Windows优化大师最新版 V7.99 Build 12.604发布

    本文由 www.169it.com 收集整理 Windows优化大师是一款功能强大的系统工具软件,它提供了全面有效且简便安全的系统检测.系统优化.系统清理.系统维护四大功能模块及数个附加的工具软件.使 ...

  2. php数组中删除元素之重新索引

    如果要在某个数组中删除一个元素,可以直接用的unset,但今天看到的东西却让我大吃一惊 <?php $arr = array('a','b','c','d'); unset($arr[1]); ...

  3. VxWorks 6.9 内核编程指导之读书笔记 -- 多任务(二)

    VxWorks的系统任务 VxWorks在引导时启动的系统任务依赖于配置,有些总是运行.任务集与VxWorks的基本配置相关,很少的任务常用于可选的组件. 注意:别挂起.删除或改变任何系统任务的优先级 ...

  4. SQL Server数据库学习总结

    经过一段时间的学习,也对数据库有了一些认识,数据库基本是由表,关系,操作组成:对于初学者首先要学的     一图胜“十”言:SQL Server 数据库总结 一个大概的总结 经过一段时间的学习,也对数 ...

  5. JS学习第三课

    写表格时最好自己写上<tbody>,因为在JS里面要用,要不然html里没有,但是我们在JS里面用得飞起,也说不过去啊. 获取表格元素时,tBodis[0]一定要加上,本人试过不加,然后就 ...

  6. 勿在浮沙筑高台-- 关于IT技术学习的一点反思

    常常看到前辈们大牛们感慨, 感慨我们这一代人生活在最好的时代, 拥有海量的学习资源以及指数增长的新技术与新知识. 的确, 如果你是这个时代的大学生,或是初出茅庐的程序员, 你会发现有太多太多的选择,  ...

  7. java中的异常处理机制_函数覆盖时的异常特点

    /*注意:异常声明在函数上 异常在子父类覆盖时的体现1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者异常的子类2.如果父类方法抛出多个异常,那么子类在覆盖该方法 ...

  8. 远程连接postgres,出现server doesnt listen

    已修改pg_hdb.conf中的 # IPv4 local connections:     host    all             all             127.0.0.1/32 ...

  9. 如何在java类中读取Properties配置文件

    在com.example包下有一个test.properties文件和测试类PropertyReadTest.java. test.properties 文件内容: author=zeige  tea ...

  10. 【原】使用ajax的get异常获取数据的时候,IE浏览器总是有缓存

    //HTML里有下面这样一段代码 //异步获取准备人信息 $.get("PrepSetpNew/PrepareMainCrew.ashx?Method=GetPrepUserInfo&quo ...