//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. [Python] Use a Python Generator to Crawl the Star Wars API

    In this lesson, you will be introduced to Python generators. You will see how a generator can replac ...

  2. how to backup and restore database of SQL Server

    Back up 1,右键选中需要备份的数据库,Tasks-->Backup 2.General中,Destination,先remove掉之前的,然后再Add 需要注意的是,add的文件,必须要 ...

  3. BZOJ 4236 set乱搞

    思路: 取个差 在set里面找 更新 (这个用map更好吧 但是我不会--) //By SiriusRen #include <set> #include <cstdio> # ...

  4. css3 实现加载滚动条效果

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

  5. UVC和V4L2的关系(转载)

    UVC是一种usb视频设备驱动.用来支持usb视频设备,凡是usb接口的摄像头都能够支持 V4L2是Linux下的视频采集框架.用来统一接口,向应用层提供API UVC: USB video clas ...

  6. df---显示磁盘分区使用空间

    df命令用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法 df(选项)(参数) 选项 -a或--all:包含全部的文 ...

  7. Flex与Java通信之HttpService

    flashbuilder4.6.myeclipse10 参考:http://www.cnblogs.com/lovemoon714/archive/2012/05/25/2517684.html 1. ...

  8. Android学习总结(1)——好的 Android 开发习惯

    Android编码规范 java代码中不出现中文,最多注释中可以出现中文: 局部变量命名.静态成员变量命名:只能包含字母,单词首字母出第一个都为大写,其他字母都为小写: 常量命名:只能包含字母和 ,字 ...

  9. redis练习手册<二>快速入门

    Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用 ...

  10. PatentTips - Virtual translation lookaside buffer

    BACKGROUND OF THE INVENTION A conventional virtual-machine monitor (VM monitor) typically runs on a ...