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 获取中文拼音,Select自动匹配字母获取值的代码
Sep 23 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
Jun 30 Javascript
JAVASCRIPT函数作用域和提前声明 分享
Aug 22 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
Feb 19 Javascript
处理文本部分内容的TextRange对象应用实例
Jul 29 Javascript
JavaScript中的函数嵌套使用
Jun 04 Javascript
动态的9*9乘法表效果的实现代码
May 16 Javascript
jQuery使用ajax_动力节点Java学院整理
Jul 05 jQuery
requireJS模块化实现返回顶部功能的方法详解
Oct 16 Javascript
vue配置请求本地json数据的方法
Apr 11 Javascript
vue js秒转天数小时分钟秒的实例代码
Aug 08 Javascript
vue中的watch监听数据变化及watch中各属性的详解
Sep 11 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
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
Ruffy javascript 学习笔记
2009/11/30 Javascript
javascript两段代码,两个小技巧
2010/02/04 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
总结js函数相关知识点
2018/02/27 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
通过Pandas读取大文件的实例
2018/06/07 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
django url到views参数传递的实例
2019/07/19 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
python绘制动态曲线教程
2020/02/24 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
上课说话检讨书大全
2014/01/22 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
企业业务员岗位职责
2014/03/14 职场文书
宣传工作经验材料
2014/06/02 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
电台广播稿范文
2015/08/19 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python