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 相关文章推荐
关于IE7 IE8弹出窗口顶上
Dec 22 Javascript
for 循环性能比较 提高for循环的效率
Mar 19 Javascript
Javascript动态绑定事件的简单实现代码
Dec 25 Javascript
jQuery ajax dataType值为text json探索分享
Sep 23 Javascript
高效的获取当前元素是父元素的第几个子元素
Oct 15 Javascript
jQuery操作input值的各种方法总结
Nov 21 Javascript
jquery的ajax异步请求接收返回json数据实例
Jun 16 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
JS监控关闭浏览器操作的实例详解
Sep 12 Javascript
React Native悬浮按钮组件的示例代码
Apr 05 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 Javascript
浅谈Node 异步IO和事件循环
May 05 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读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
了解重排与重绘
2019/05/29 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
Python入门篇之条件、循环
2014/10/17 Python
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
浅析python参数的知识点
2018/12/10 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
python中 * 的用法详解
2019/07/10 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
人力资源主管的岗位职责
2014/03/15 职场文书
树转促学习心得体会
2014/09/10 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
初婚初育证明范本
2015/06/18 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
Python+Appium自动化测试的实战
2021/06/30 Python