Javascript实现单例模式


Posted in Javascript onJanuary 24, 2016

单例模式也称作为单子模式,更多的也叫做单体模式。为软件设计中较为简单但是最为常用的一种设计模式。

单例模式的介绍:

    在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为。比如在整个系统的配置文件中,配置数据有一个单例对象进行统一读取和修改,其他对象需要配置数据的时候也统一通过该单例对象来获取配置数据,这样就可以简化复杂环境下的配置管理。

    单例模式的思路是:一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance 名称)。那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回。同时将该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例。

一般情况下,Javascript每次new一个对象就产生一个实例,实例指向不同的地址。就像如下:

(function(){
function Person(name){
this.name = name;
}
Person.prototype.work = function(){
console.log(this.name + " is working");
}
var p1 = new Person("Darren");
p1.work();
var p2 = new Person("Jack");
p2.work();
}());

以上,每次new出一个Person对象都是不同的。

如何在Javascript中实现单例模式呢?

--在生成某各对象时先判断是否存在。存在就不生成对象,不存在就生成对象。

(function(){
var PersonSingleton = (function(){
var instance;
function init(){
return {
name: 'Anonymous',
work: function(){
console.log(this.name + ' working');
}
};
}
return {
getInstance: function(){
if(!instantiated){
instantiated = init();
}
return instantiated;
}
}
})();
var p1 = PersonSingleton.getInstance();
p1.work();
var p2 = PersonSingleton.getInstance();
p2.work();
}());

以上,通过PsonSIngleton对象的getInstance方法得到的实例每次都是一样的。

关于javascript单例模式的相关知识就给大介绍到这里,希望对大家有所帮助。

Javascript 相关文章推荐
JQuery UI DatePicker中z-index默认为1的解决办法
Sep 28 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
Dec 28 Javascript
document.execCommand()的用法小结
Jan 08 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
Jan 22 Javascript
jQuery实现动态文字搜索功能
Jan 05 Javascript
详解Node全局变量global模块
Sep 28 Javascript
详解vue中使用express+fetch获取本地json文件
Oct 10 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
vue2实现数据请求显示loading图
Nov 28 Javascript
解决修复npm安装全局模块权限的问题
May 17 Javascript
使用typescript构建Vue应用的实现
Aug 26 Javascript
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
Apr 09 Javascript
原生JavaScript实现滚动条效果
Mar 24 #Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
Jan 23 #Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
Jan 23 #Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
Jan 23 #Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
Jan 23 #Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 #Javascript
AngularJS使用ngOption实现下拉列表的实例代码
Jan 23 #Javascript
You might like
PHP 读取Postgresql中的数组
2013/04/14 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
Javascript 布尔型分析
2008/12/22 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
python编写微信远程控制电脑的程序
2018/01/05 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
python重试装饰器的简单实现方法
2019/01/31 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
Python try except else使用详解
2021/01/12 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
.NET常见笔试题集
2012/12/01 面试题
2014年幼儿园教师工作总结
2014/11/08 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书