/*
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. 第二回 认识CDN

    CDN的全称是Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节 ...

  2. asp.net渐变

    简介:第一个参数代表渐变的方向,后面的StartColorStr和End就不用解释了: filter: progid:DXImageTransform.Microsoft.Gradient(Gradi ...

  3. CSS之transition(动画)

    Transform字面上就是变形,改变的意思.在CSS中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix. 下面我们一 ...

  4. java web服务器文件的下载(有下载弹出匡)

    昨天做了一个文件从服务下载的功能,怎么都不弹出页面,下载框.后查询得知.目前两种方法 1.<a href='下载路径' /> 2.window.location.href = basePa ...

  5. 冒泡,快排算法之javascript初体验

    引子:javascript实际使用的排序算法在标准中没有定义,可能是冒泡或快排.不用数组原生的 sort() 方法来实现冒泡和快排. Part 1:冒泡排序(Bubble Sort) 原理:临近的两数 ...

  6. c++学习——类成员的访问权限

    成员的访问权限 Public: 任何人,尤其是那些要使用这个类库的客户程序员,都能访问那个紧跟在public 后面声明的成员. 默认的package: 在同一个目录里面的文件,并且都没有明确指明它是属 ...

  7. WEB应用中的SESSION知多少?

    作为一名WEB开发程序员,对session的理解是最基础的,但是现状是WEB程序员遍地都是,随便一划拉一大把,不过估计能把session能透彻理解的人应该不是很多,起码我之前对此是知之甚少,偶然看到的 ...

  8. 《通过脚本查看哪些ip被占用》shell笔记

    改脚本查看哪些ip被占用. #!/bin/bash for i in {1..10}   //赋予i变量1-10 do   //干什么 ping -c1 -w1 192.168.7.$i && ...

  9. SDRAM控制器

    1 初始化以及load mode 寄存器1 初始化以及load mode 寄存器 2  时间表 这里会有几个重要的时间周期: 3 AUTO REFRESH (自动刷新) 4 CAS(CL delay) ...

  10. WINDOWS下PHP 的pear DB的安装(本地环境:PHP5.4.15+Apache+mysql)

    因为需要安装phpunit,要先装pear,网上的教程大多数是以双击go-pear.bat开始,但是我安装的php文件夹里压根没有这个文件. 经过几次搜索之后终于找到了办法. 解决步骤如下: 1.下载 ...