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 相关文章推荐
解析使用JS 清空File控件的路径值
Jul 08 Javascript
JavaScript中的eval()函数详解
Aug 22 Javascript
红米手机抢购的js代码
Mar 10 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
Oct 31 Javascript
JS函数this的用法实例分析
Feb 05 Javascript
JS验证IP,子网掩码,网关和MAC的方法
Jul 02 Javascript
JS实现仿QQ效果的三级竖向菜单
Sep 25 Javascript
node.js require() 源码解读
Dec 13 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 Javascript
express中static中间件的具体使用方法
Oct 17 Javascript
详解小程序如何动态绑定点击的执行方法
Nov 26 Javascript
手把手教您实现react异步加载高阶组件
Apr 07 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
PHP HTML代码串 截取实现代码
2009/06/29 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
php建立Ftp连接的方法
2015/03/07 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
JS中递归函数
2016/06/17 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
python之super的使用小结
2018/08/13 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
解析python实现Lasso回归
2019/09/11 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
企业演讲稿范文
2013/12/28 职场文书
校园演讲稿汇总
2014/05/21 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
2015年复活节活动总结
2015/02/27 职场文书
2015最新婚礼主持词
2015/06/30 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
python函数的两种嵌套方法使用
2022/04/02 Python
Redis实现分布式锁的五种方法详解
2022/06/14 Redis