JavaScript实现单例模式实例分享


Posted in Javascript onDecember 22, 2017

传统单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现单例核心思想

无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象,接下来我们用JavaScript来强行实现这个思路,请看代码:

var Singleton = function( name ){
  this.name = name;
};
Singleton.prototype.getName = function(){ alert ( this.name );
};
Singleton.getInstance = (function(){ 
var instance = null;

return function( name ){





if ( !instance ){






instance = new Singleton( name );





}




return instance;


 }
})();

我们通过Singleton.getInstance来获取Singleton类的唯一对象,这样确实是没问题的,但是js本身是没有类这种概念的,所以我们强行用传统单例思想来实现是没有任何意义的,这样的代码又臭又长(其实是我自己看着不舒服嘻嘻嘻)。下面我们使用JavaScript的闭包来实现一个单例,请看代码:

var CreateDiv = (function(){ 

var instance;



var CreateDiv = function( html ){ 




if ( instance ){






return instance; 




}





this.html = html; this.init();





return instance = this;
};
CreateDiv.prototype.init = function(){
var div = document.createElement( 'div' );
div.innerHTML = this.html; 
document.body.appendChild( div );



};



return CreateDiv; })();
var a = new CreateDiv( 'sven1' ); var b = new CreateDiv( 'sven2' );
alert ( a === b ); // true

可以看到,这样我们确实用闭包来实现了一个单例,但这个代码还是高度耦合的,CreateDiv的构造函数实际上负责了两件事情。第一是创建对象和执行初始化init方法,第二是保证只有一个对象。这样的代码是职责不明确的,现在我们要把这两个工作分开,构造函数就负责构建对象,至于判断是返回现有对象还是构造新的对象并返回,我们交给另外一个函数去完成,其实也就是为了满足一个编程思想:单一职责原则。这样的代码才能更好的解耦,请看下面代码:

var CreateDiv = function (html) {
    this.html = html;
    this.init();
  };
  CreateDiv.prototype.init = function () {
    var div = document.createElement('div');
    div.innerHTML = this.html;
    document.body.appendChild(div);
  };
  var ProxySingletonCreateDiv = (function () {
    var instance;
    return function (html) {
      if (!instance) {
        instance = new CreateDiv(html);
      }
      return instance;
    }
  })();
  var a = new ProxySingletonCreateDiv('sven1');
  var b = new ProxySingletonCreateDiv('sven2');
  alert(a === b); //true

可以看到,现在我们的构造函数CreateDiv现在只负责构造对象,至于是返回现有对象还是构造新的对象并返回,这件事我们交给了代理类proxySingletonCreateDiv来处理,这样的代码看着才舒(zhuang)服(bi)嘛!

最后贴一个高度抽象的单例模式代码,惰性单例的精髓!

//单例模式抽象,分离创建对象的函数和判断对象是否已经创建
  var getSingle = function (fn) {
    var result;
    return function () {
      return result || ( result = fn.apply(this, arguments) );
    }
  };

形参fn是我们的构造函数,我们只要传入任何自己需要的构造函数,就能生成一个新的惰性单例。比如说传入创建一个女朋友的构造函数,并且调用getSingle(),就能生成一个新的女朋友。如果以后再调getSingle(),也只会返回刚才创建的那个女朋友。至于新女朋友——不存在的。

单例常用场景

只需要生成一个唯一对象的时候,比如说页面登录框,只可能有一个登录框,那么你就可以用单例的思想去实现他,当然你不用单例的思想实现也行,那带来的结果可能就是你每次要显示登陆框的时候都要重新生成一个登陆框并显示(耗费性能),或者是不小心显示出了两个登录框。

以上就是我们给大家分享的关于JS实现单例模式的相关学习的心得,感谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript自定义DateDiff函数(兼容所有浏览器)
Mar 01 Javascript
IE与FireFox的JavaScript兼容问题解决办法
Dec 31 Javascript
jquery实现pager控件示例
Apr 09 Javascript
轻松实现Bootstrap图片轮播
Apr 20 Javascript
详解js中Json的语法与格式
Nov 22 Javascript
AngularJS开发教程之控制器之间的通信方法分析
Dec 25 Javascript
jQuery+HTML5实现弹出创意搜索框层
Dec 29 Javascript
利用Vue v-model实现一个自定义的表单组件
Apr 27 Javascript
vue调试工具vue-devtools安装及使用方法
Nov 07 Javascript
实例详解带参数的 npm script
May 28 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
Sep 11 Javascript
Vue Render函数创建DOM节点代码实例
Jul 08 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 #Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
Dec 22 #Javascript
vue init失败简单解决方法(终极版)
Dec 22 #Javascript
使用axios实现上传图片进度条功能
Dec 21 #Javascript
详解使用webpack构建多页面应用
Dec 21 #Javascript
使用ajax的post同步执行(实现方法)
Dec 21 #Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 #jQuery
You might like
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
js实现蒙版效果
2020/01/11 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
渔夫的故事教学反思
2014/02/14 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
小学母亲节活动方案
2014/03/14 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
活动总结模板大全
2015/05/11 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
锦旗赠语
2015/06/23 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript
canvas 中如何实现物体的框选
2022/08/05 Javascript