//module: Module模式是JavaScript编程中一个非常通用的模式
 window.onload = function() {
//1、基本使用:
var MyFn = function() {
var age = 24,sex = "boy";//私有变量
var action = function() {//私有行为
console.log("it man");
};
return {//暴露的公开成员
work : "orderMonkey",
action2 : function() {
console.log("it developer!");
}
}
};
var newMyFn = new MyFn();
console.log(newMyFn.action2());
console.log("===============================");
//基本用法的缺点:每次使用时都要使用new 关键字生成,这样在内存中每次会copy一份,占用内存,使用闭包可以避免内存问题,实现自执行。也可以实现功能的扩展。 //2、模块方法:
var MyFn2 = (function() {
var my = {};//向外返回的对象
var age = 25,name = "assassin";
var action = function() {
console.log("内部私有成员");
};
my.EnglishName = "wanghf";
my.action2 = function() {
console.log("major in JavaScript!");
};//公有代码状态
return my;
/*return my = {//向外返回的对象
work : "It developer",
action2 : function() {
console.log("外部成员变量");
}
}*/
})();
console.log(MyFn2.action2());//调用时避免生成,减小内存占有量
console.log("===============================");
//模块方法全局变量的引入和jQuery设计思路一样采用全局传参
var MyFn3 = (function($) {
//同上
})(jQuery);
//3、模块的扩展:
//对于大型项目测需要对自己的扩展了,基于上述的思想,同样把自己作为参数传值,进行扩展
var MyFn2 = (function(my) {//var不是必写,为了统一。
my.addName = "intelwisd";
my.addAction3 = function() {
console.log("扩展的新方法...");
};
/*var my1 = {
addName : "intelwisd",
addAction3 : function() {
console.log("外部成员变量");
}
};*/ //对象的形式有对象的拷贝之前的会覆盖以前的
return my;
})(MyFn2);
console.log(MyFn2.action2());
console.log("===============================");
//4、松耦合扩展和紧耦合扩展
//松耦合扩展 利用 var MyFn2 = MyFn2 || {};
var MyFn2 = (function(my) {
my.addName1 = "intelwisd1";
my.addAction4 = function() {
console.log("松耦合扩展的新方法...");
};
/*var my = {
addName: "intelwisd111",
addAction3: function () {
console.log("外部成员变量");
}
};*/
return my;
})(MyFn2 || {});
console.log(MyFn2.EnglishName);
console.log(MyFn2.addName1);
console.log(MyFn2.action2());
console.log(MyFn2.addAction4());
//松耦合的优点:确保该对象,在存在的时候直接用,不存在的时候直接赋值为{}
console.log("===============================");
//紧耦合扩展 可以实现重载的功能,但要确保加载顺序
var MyFn2 = (function(my) {
var addAction4 = my.newAddAction4;
my.newAddAction4 = function() {//重载函数,以前的函数可以继续使用
console.log("紧耦合扩展....");
};
return my;
})(MyFn2);
console.log(MyFn2.addAction4());
console.log(MyFn2.newAddAction4());
console.log("===============================");
//5、克隆与继承 (在紧耦合的基础上进行继承,其实该对象的属性对象或function根本没有被复制,只是对同一个对象多了一种引用而已,所以如果老对象去改变它,那克隆以后的对象所拥有的属性或function函数也会被改变。)
var MyFn2 = (function(my) {
var my1 = {}, key;
for (key in my) {
if (my.hasOwnProperty(key)) {
my1[key] = my[key];
}
}
var addAction4 = my1.newAddAction4;
my1.newAddAction4 = function() {//重载函数,以前的函数可以继续使用
console.log("紧耦合扩展2....");
// 克隆以后,进行了重写,当然也可以继续调用以前的
};
return my1;
})(MyFn2);
console.log(MyFn2.addAction4());
console.log(MyFn2.newAddAction4());
console.log("===============================");
//6、跨文件中的私有成员的共享
var MyFn3 = (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;
} (MyFn2 || {}));
//任何文件都可以对他们的局部变量_private设属性,并且设置对其他的文件也立即生效。一旦这个模块加载结束,应用会调用 blogModule._seal()"上锁",这会阻止外部接入内部的_private。如果这个模块需要再次增生,应用的生命周期内,任何文件都可以调用_unseal() ”开锁”,然后再加载新文件。加载后再次调用 _seal()”上锁”。
//子模块共有的成员创建
MyFn2.CommentSubModule = (function () {
var my = {};
// ... return my;
} ());
//eg:
MyFn3.CommentSubModule = (function () {
var my = {
name : "assassin",
Fn1 : function() {
alert(0);
}
};
// ... return my;
} ());
}

学习来源Tom大叔javascript--Module

JavaScript--Module模式的更多相关文章

  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模式 - 深入了解Javascript

    /* Modelu模式 优点:效率高,代码少,加载速度快,松耦合允许并行加载,提升下载速度 缺点:初始化时间久一点 */ //一.基础用法 var calculate = function (eq) ...

  7. (转)深入理解JavaScript 模块模式

    深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...

  8. Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)

    JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...

  9. JavaScript module pattern精髓

    JavaScript module pattern精髓 avaScript module pattern是一种常见的javascript编码模式.这种模式本身很好理解,但是有很多高级用法还没有得到大家 ...

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

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

随机推荐

  1. error:assign attribute must be unsafeunretained

    今天在使用协议的过程中.偶然发现这样使用 ? 1 2 3 4 5 6 7 8 9 10 @interface AppDelegate (){     id<chatdelegate>  t ...

  2. 一起talk C栗子吧(第八十一回:C语言实例--进程停止)

    各位看官们,大家好,上一回中咱们说的是进程相互排斥的样例,这一回咱们说的样例是:进程停止.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了怎样创建进程,只是没有介绍停止进 ...

  3. js插件---图片懒加载lazyload

    js插件---图片懒加载lazyload 一.总结 一句话总结:使用异常简单,src里面放加载的图片,data-original里面放原图片,不懂的位置去官网或者github找API就好. 1.laz ...

  4. BZOJ 3262 cdq分治 OR 树套树

    注意判断 三个条件都一样的-- (CDQ分治 其实并不是很难理解 只是想不到--) CDQ分治: //By SiriusRen #include <cstdio> #include < ...

  5. 图解RHEL6从安装光盘中进行yum安装

    图解RHEL6从安装光盘中进行yum安装 导读:我们这里讲的Yum,是Yellow dog Updater, Modified的缩写,可执行程序名为yum,它的理念是使用一个中心仓库(reposito ...

  6. hight charts

    hight charts http://www.hcharts.cn/resource/index.php http://www.hcharts.cn/api/index.php

  7. Hexo 搭建

    前提 最近准备搭建一个博客平台,也看了很多开源的博客框架.比如Solo.wordpress等框架.自已曾经也在cnblog发布过几篇文章.东写写西写写.杂乱无章的.后续可以写一个自动同步各平台的程序~ ...

  8. 【Henu ACM Round#15 D】Ilya and Escalator

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 概率DP; 设f[i][j]表示前i个单位时间,j个人进入房间的概率是多少 然后想一下和i-1秒的时候要怎么转移就可以了. i-1秒 ...

  9. 压缩感知——SP(subspace pursuit)重构算法前言翻译

    压缩感知是一种採样方法,它和变换编码类似,后者被广泛用于涉及到大规模数据採样的现代通信系统中.变换编码将高维空间中的输入信号.转换成很低的低维空间中的信号.变换编码器的样例有著名的小波变换和普遍存在的 ...

  10. es62

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...