JavaScript--Module模式
//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模式的更多相关文章
- javascript --- 设计模式之Module模式
基本用法 先看一下最简单的一个实现,代码如下: var Calculator = function(){ // 这里可以声明私有成员 var eqCtrl = document.getElement( ...
- 【JavaScript】设计模式-module模式及其改进
写在前面 编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方 说到这里...... <head first设计模式>里有一篇文章, ...
- javascript闭包(Module模式)的用途和高级使用方式
javascript闭包(Module模式)的用途和高级使用方式 javascript闭包的用途:1. 匿名自执行函数:或者可以理解为,避免污染全局变量2. 缓存:源于闭包的核心特性便是保存状态,应用 ...
- <深入理解JavaScript>学习笔记(3)_全面解析Module模式
简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 模块化,可 ...
- 深入理解JavaScript系列(3):全面解析Module模式
简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 模块化,可 ...
- Module模式 - 深入了解Javascript
/* Modelu模式 优点:效率高,代码少,加载速度快,松耦合允许并行加载,提升下载速度 缺点:初始化时间久一点 */ //一.基础用法 var calculate = function (eq) ...
- (转)深入理解JavaScript 模块模式
深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...
- Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)
JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...
- JavaScript module pattern精髓
JavaScript module pattern精髓 avaScript module pattern是一种常见的javascript编码模式.这种模式本身很好理解,但是有很多高级用法还没有得到大家 ...
- 【设计模式】module模式&&Revealing module (揭示)模式
写在前面 <head first设计模式>里有一篇文章,是说使用模式的心智, 1.初学者"心智" :"我要为HELLO WORLD找个模式" 2.中 ...
随机推荐
- ORA-12514: TNS: 监听程序当前无法识别连接描写叙述符中请求的服务
不指定数据库能够正常连接: 指定数据库和使用PL/SQL Developer都出现错误: 在此说明一下我的环境:Oralce装的是64位的在使用PL/SQL Developer时曾出现过初始化错误,解 ...
- vdceye 最新中文界面
最新的vdceye 的界面.左边菜单增加了问题.并增加了虚拟摄像机部分 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmlkZW9fZGM=/font/5 ...
- 【图像配准】基于互信息的图像配准算法:MI、EMI、ECC算法
简单介绍: 基于互信息的图像配准算法以其较高的配准精度和广泛的适用性而成为图像配准领域研究的热点之中的一个.而基于互信息的医学图像配准方法被觉得是最好的配准方法之中的一个.基于此.本文将介绍简单的基于 ...
- 数据格式转换 (三)Office文档转HTML
HTML Filter 是由北京红樱枫软件有限公司根据HTML Ver 4.01/CSS式样,研制和开发的MS Office系列文档到HTML转换的通用程序库.便于用户实现对多种文档的统一管 ...
- Android活动状态和生存期
活动状态 1.运行状态(顶层的活动) 2.暂停状态(非顶层的,可见的活动) 3.停止状态(非顶层的,不可见的活动) 4.销毁状态(保证手机的内存充足) 活动的生存期 完整的生存期 onCreate活动 ...
- 78.Nodejs基础中间件Connect
转自:https://www.cnblogs.com/chris-oil/p/5625437.html 前言 “中间件”在软件领域是一个非常广的概念,除操作系统的软件都可以称为中间件,比如,消息中间件 ...
- jQuery和JavaScript的点击事件区别
// $("#indexPage").click(); // 触发了a标签的点击事件,但是没有触发页面跳转 document.getElementById("indexP ...
- UVA 12508 - Triangles in the Grid(计数问题)
12508 - Triangles in the Grid 题目链接 题意:给定一个n∗m格子的矩阵,然后给定A,B.问能找到几个面积在A到B之间的三角形. 思路:枚举每一个子矩阵,然后求[0,A]的 ...
- 从头认识java-13.12 超类通配符
这一章节我们来讨论一下超类通配符. 1.什么是超类通配符 在前一章节我们提到一种通配符,是使用<? extends XXX>来实现的,导致了后面的一系列问题,如今我们引入还有一种通配符-- ...
- 验证list的底层数据结构
<STL源代码剖析>中,指出SGI STL的list底层数据结构式循环双向链表.而且在链表尾端留一个空白节点.让end指向它.因为是双向的,那么list的迭代器必须是Bidirection ...