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 相关文章推荐
JS 无法通过W3C验证的处理方法
Mar 09 Javascript
纯js代码实现简单计算器
Dec 02 Javascript
关于js函数解释(包括内嵌,对象等)
Nov 20 Javascript
Vue-resource实现ajax请求和跨域请求示例
Feb 23 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
May 08 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
Jul 12 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
Aug 23 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
Oct 15 Javascript
关于vue 结合原生js 解决echarts resize问题
Jul 26 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
原生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
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
php简单统计中文个数的方法
2016/09/30 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
Javascript 错误处理的几种方法
2009/06/13 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
设置python3为默认python的方法
2018/10/31 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
外贸专业求职信
2014/03/09 职场文书
小学课外活动总结
2014/07/09 职场文书
调任通知
2015/04/21 职场文书
《家》读后感:万惜拯救,冷暖自知
2019/09/25 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
详解在OpenCV中如何使用图像像素
2022/03/03 Python