/*
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. $_SERVER 中重要的元素

      元素/代码 描述 $_SERVER['PHP_SELF'] 返回当前执行脚本的文件名. $_SERVER['GATEWAY_INTERFACE'] 返回服务器使用的 CGI 规范的版本. $_SE ...

  2. SQL 复制订阅 异常后 强制删除

    最近做数据库同步备份工作,将 主库 通过SQLService 自带的 [复制] 订阅出去后,因为 订阅方(从库) 发生异常,主库 无法确定 从库的订阅,就想清理了,订阅重新做同步,结果.....主库上 ...

  3. OpenFiler安装与基本配置

    一.            安装篇 1.      插入安装盘 2.      选择键盘输出 3.      对硬盘进行分区 4.      删除所有数据并重新分区 5.      配置IP地址等信息 ...

  4. Cocos2d-JS中的cc.LabelAtlas

    cc.LabelAtlas是图片集标签,其中的Atlas本意是“地图集”.“图片集”,这种标签显示的文字是从一个图片集中取出的,因此使用cc.LabelAtlas需要额外加载图片集文件.cc.Labe ...

  5. 对象属性封装到map中

    import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.lang.reflect.Modi ...

  6. 理解ClassLoader基本原理

    当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构:        bootstrap classloader                 |        exte ...

  7. builder-设计模式

    package com.wp.java.builder; import org.junit.Test; public class DoDoContactDemo { @Test public void ...

  8. bootstrap时间插件 火狐不显示 完美解决方法

    原文链接:http://www.phpbiji.cn/article/index/id/141/cid/4.html bootstrap时间插件火狐 bootstrap-datetimepicker火 ...

  9. SignalR 2.0 系列: 开始使用SignalR 2.0

    这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第四篇:开始使用SignalR 2.0 原文:Getting S ...

  10. Mac OS + Nginx + Mysql + PHP 本地环境搭建

    本文是用Mac系统下搭建的环境,使用Linux的童鞋也不要在意,因为很相似,只有下载安装的方式有一点区别.直接进入正文: 1.首先我们需要下载Homebrew,Homebrew简称brew,是Mac ...