JS实现单例模式的步奏详解

这次给大家带来JS实现单例模式的步奏详解,JS实现单例模式的注意事项有哪些,下面就是实战案例,一起来看一下。

传统单例模式

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

实现单例核心思想

无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象,接下来我们用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 Createp = (function(){       var instance;      var Createp = function( html ){           if ( instance ){            return instance;           }          this.html = html; this.init();          return instance = this;};Createp.prototype.init = function(){var p = document.createElement( 'p' );p.innerHTML = this.html; document.body.appendChild( p );      };      return Createp; })();var a = new Createp( 'sven1' ); var b = new Createp( 'sven2' );alert ( a === b ); // true

登录后复制

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

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

登录后复制

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

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

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

登录后复制

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

单例常用场景

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

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

怎样操作jackson解析json字符串时首字母的大小写转换

localstorage和sessionstorage在Vue中怎么使用

以上就是JS实现单例模式的步奏详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2772538.html

(0)
上一篇 2025年3月8日 13:19:36
下一篇 2025年3月8日 13:19:49

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎样操作jackson解析json字符串时首字母的大小写转换

    这次给大家带来怎样操作jackson解析json字符串时首字母的大小写转换,操作jackson解析json字符串时首字母大小写转换的注意事项有哪些,下面就是实战案例,一起来看一下。 问题 楼主碰到的问题是,在实体类和表中定义的某个字段为RM…

    编程技术 2025年3月8日
    000
  • JS怎样将json格式数组下载到excel表格里

    这次给大家带来js怎样将json格式数组下载到excel表格里,js将json格式数组下载到excel表格里的注意事项有哪些,下面就是实战案例,一起来看一下。 实例如下: $(document).ready(function(){ $(‘#…

    编程技术 2025年3月8日
    200
  • JS做出移动端触摸轮播效果

    这次给大家带来JS做出移动端触摸轮播效果,JS做出移动端触摸轮播效果的注意事项有哪些,下面就是实战案例,一起来看一下。 下面是移动端手指滑动轮播图的完整代码。 *{margin:0;padding:0;}li{list-style:none…

    2025年3月8日 编程技术
    200
  • JS的多线程运行库Nexus.js使用详解

    这次给大家带来JS的多线程运行库Nexus.js使用详解,使用JS多线程运行库Nexus.js的注意事项有哪些,下面就是实战案例,一起来看一下。 首先,如果你不熟悉这个项目,建议先阅读之前写的一系列文章。如果你不想阅读这些,不用担心。这里面…

    编程技术 2025年3月8日
    200
  • JS操作TXT文本在指定位置插入内容

    这次给大家带来JS操作TXT文本在指定位置插入内容,JS操作TXT文本在指定位置插入内容的注意事项有哪些,下面就是实战案例,一起来看一下。 实例如下所示: function insertAtCursor(myField, myValue) …

    编程技术 2025年3月8日
    200
  • nodejs怎么实现gulp打包功能

    这次给大家带来nodejs怎么实现gulp打包功能,nodejs实现gulp打包功能的注意事项有哪些,下面就是实战案例,一起来看一下。 最近换了家新公司,由于是创业公司,项目基本从零开始搭建。工作几年,也没想过写点什么技术性的东西,今天突然…

    编程技术 2025年3月8日
    200
  • 使用nodejs在微信中调用收货地址

    这次给大家带来使用nodejs在微信中调用收货地址,使用nodejs在微信中调用收货地址的注意事项有哪些,下面就是实战案例,一起来看一下。 1、微信调取收货地址API,公众号必须有支付权限。2、配置对应使用收货地址功能的域名(域名配置请在公…

    编程技术 2025年3月8日
    200
  • Vuejs响应式原理具体解析

    这次给大家带来Vuejs响应式原理具体解析,使用Vuejs响应式原理的注意事项有哪些,下面就是实战案例,一起来看一下。 响应式原理 > vuejs中的模型(model)和视图(view)是保持同步的,在修改数据的时候会自动更新视图,这…

    编程技术 2025年3月8日
    200
  • JS的class、构造函数、工厂函数使用方法

    这次给大家带来JS的class、构造函数、工厂函数使用方法,使用JSclass、构造函数、工厂函数的注意事项有哪些,下面就是实战案例,一起来看一下。 到了ES6时代,我们创建对象的手段又增加了,在不同的场景下我们可以选择不同的方法来建立。现…

    编程技术 2025年3月8日
    200
  • 在Angular2里去除url中#号的操作详解

    这次给大家带来在Angular2里去除url中#号的操作详解,在Angular2里去除url中#号的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 本文中主要介绍了关于Angular2+中去除url中#号的相关内容,这是最近在工作中…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论