JavaScript设计模式之单体模式全面解析


Posted in Javascript onSeptember 09, 2016

单体是一个用来划分命名空间并将一些相关的属性与方法组织在一起的对象,如果她可以被实例化的话,那她只能被实例化一次(她只能嫁一次,不能二婚)。

单体模式是javascript里面最基本但也是最有用的模式之一。

特点:

1. 可以用来划分命名空间,从而清除全局变量所带来的危险或影响。

2. 利用分支技术来来封装浏览器之间的差异。

3. 可以把代码组织的更为一体,便于阅读和维护。

单体模式的基本写法:

/* 最基本的单体模式 */ 
var her = {
name: 'Anna',
sex: 'women',
say: function(){
// 一些处理逻辑......
},
doing: function(){
// 另一些处理函数......
} 
}

1. 划分命名空间:

var box = {
width: 0,
height: 0,
getArea: function(){
return this.width * this.width; // js中对象成的访问必须是显示的,即this是不能省略的
},
init: function(w, h){
// width = w;
// height = h;这种方式相当于定义了两个全局变量,(没加var声明的变量为全局变量)
// 并不是对对象width和height的赋值
// 下面是正确的
this.width = w;
this.height = h;
}
} //box划分了一个命名空间,命名空间里的变量只在空间里有效

上面的单体中的所有的成员以及方法都是公有的(public),也就是在单体的外部可以对她们进行任意的改动(但不能访问其中的局部变量),那为什么说单体提供了一个命名空间呢?

别急,我们接着往下看:

var box = {
width:0,
height:0,//单体的变量
getArea:function(){
return width * height;// width,height其实并不是单体的变量,而是在init中定义的全局变量
}
init:function(w,h){
width = w;
height = h;
}
}// init中width,height其实并不是单体的变量
window.onload = function(){
var init = box.getArea();
alert(init);
}

由于没有对init中的width,height进行初始化,所以会报错,这样改一下:

var box = {
width:0,
height:0,
getArea:function(){
return width * height;
},
init:function(w,h){
width = w;
height = h;
}
}
window.onload = function(){
width = 0;
height = 0;
//or box.init(0,0);
var init = box.getArea();
alert(init);
}

发现可以了,由于init和 getArea所用的width和height并不是归单体所有的变量,而是一个全局变量,所以我们可以在单体外面进行随意调用而不受影响、

var box = {
width: 0,
height: 0,
getArea: function(){
return width * height;//js中对象成的访问必须是显示的,即this是不能省略的
},
init:function(w,h){
width = w;
height = h;
}
}//这里的width,height其实并不是单体的对象
window.onload = function(){
width = 0;
height = 0;
var width = box.getArea();
alert(width);
}

这样写又会报错了,可见我们以上的方式对于全局变量并没有建立起一个命名空间,全局变量为我们带来了危险。所以最上面的写法是对的,我们来验证一下:

var box = {
width: 2,
height: 2,
getArea: function(){
return this.width * this.height;/ /js中对象成的访问必须是显示的,即this是不能省略的
},
init:function(w,h){
this.width = w;
this.height = h;
}
}
window.onload = function(){
width = 0; // 不会影响单体中的局部变量也就是命名空间
height = 0; // 不会影响单体中的局部变量也就是命名空间
var width = box.getArea();
alert(width);
}

可见在window.onload中的width 和height已经没有干扰了,因为单体为单体中的width和height建立了一个命名空间。

2. 成员的属性:

虽然在javascript中没有这么严格的面向对象(oop),但是我们可以借助闭包来进行一个模仿,毕竟有的变量设为public是很不好的。

var her = (function(){
var name = 'Anna';
var sex = 'women';
return {
getArea: function(){
return name + 'is a' + sex;
},
init:function(b){
name = b;
}
}
})();
window.onload = function(){
her.name = 'Jock'; // 无法访问
alert(ger.getArea());
her.init('Lous');
alert(her.getArea());
}

私有变量、方法是只读的,公有变量、方法是可读可写的。

访问:

对于私有成员,直接访问即可,前面不用加任何修饰,
对于公有的访问在单体作用域内前面要加上“this.”,在单体作用域外前面要加上“her.”(单体名字.)

3.利用分支技术来来封装浏览器之间的差异

注意的地方:

a. 一定要用闭包,实现即时绑定

b. 每个分支之间用分号隔开

c. 最后返回的是分支的名字

d. 调用的时候用单体名+分支的方法名;

// 利用单体的分支技术来定义XHR(XMLHttpRequest)对象,必须要用闭包才可以实现
var XHR = (function(){
//The three branches
var standard = {
cXHR:function(){
return new XMLHttpRequest();
} 
};
var activeXNew = {
cXHR:function(){
return new ActiveXObject('Msxml2.XMLHttp');
} 
};
var activeXOld = {
cXHR:function(){
return new ActiveXObject('Microsoft.XMLHttp');
} 
};
//To assign(分配) the branch, try each method;return whatever doesn't fail
var testObject;
try{
testObject = standard.cXHR();
return standard;// return this branch if no error was thrown 
}catch(e){
try{
testObject = activeXNew.cXHR();
return activeXNew;
}catch(e){
try{
testObject = activeXOld.cXHR();
return activeXOld;
}catch(e){
throw new Error('Create the XMLHttpRequestObject failed!'); 
}
}
}
})();
window.onload = function(){
alert(XHR.cXHR());
}

以上所述是小编给大家介绍的JavaScript设计模式之单体模式全面解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
分享别人写的一个小型js框架
Aug 13 Javascript
jQuery动态添加的元素绑定事件处理函数代码
Aug 02 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
Oct 16 Javascript
jQuery加密密码到cookie的实现代码
Apr 18 jQuery
Javascript ES6中数据类型Symbol的使用详解
May 02 Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
Aug 25 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
JavaScript中this用法学习笔记
Mar 17 Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 Javascript
详解在HTTPS 项目中使用百度地图 API
Apr 26 Javascript
微信小程序收藏功能的实现代码
Jun 19 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
Sep 09 #Javascript
全面解析Bootstrap表单样式的使用
Sep 09 #Javascript
jQuery+ajax读取并解析XML文件的方法
Sep 09 #Javascript
JS与jQuery实现隔行变色的方法
Sep 09 #Javascript
jQuery层次选择器用法示例
Sep 09 #Javascript
jQuery基本过滤选择器用法示例
Sep 09 #Javascript
jQuery可见性过滤选择器用法示例
Sep 09 #Javascript
You might like
php分页函数示例代码分享
2014/02/24 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
JavaScript 基本概念
2015/01/20 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
JS中递归函数
2016/06/17 Javascript
js继承实现方法详解
2016/12/16 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
详解Python中的__init__和__new__
2014/03/12 Python
Python内置函数的用法实例教程
2014/09/08 Python
python中的闭包用法实例详解
2015/05/05 Python
Python的pycurl包用法简介
2015/11/13 Python
Python控制Firefox方法总结
2019/06/03 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
opencv3/C++ 平面对象识别&透视变换方式
2019/12/11 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
Hotter Shoes英国官网:英伦风格,舒适的鞋子
2017/12/28 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
大专生工程监理求职信
2013/10/04 职场文书
公司年会晚宴演讲稿
2014/01/06 职场文书
根叔历年演讲稿
2014/05/20 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
MYSQL 运算符总结
2021/11/11 MySQL
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis