[js高手之路]单例模式实现模态框的示例


Posted in Javascript onSeptember 01, 2017

什么是单例呢?

单,就是一个的意思。例:就是实例化出来的对象,那合在一起就是保证一个构造函数只能new出一个实例,为什么要学习单例模式呢?或者说单例模式有哪些常见的应用场景.它的使用还是很广泛,比如:弹出一个模态框,一般来说在网站中弹出的模态框,不停的一直点击,一般只能创建一个。还有后台的数据库连接,一般都是保证一个连接等等。今天的主题就是单例在模态框中的应用,我们先要搞清楚,怎么弄个单例出来.

我们先看下普通的构造函数加原型方式。下面这种是常见的方式

function Singleton ( uName ){
   this.userName = uName;
   this.ins = null;
  }
  Singleton.prototype.showUserName = function(){
   return this.userName;
  }
  var obj1 = new Singleton( 'ghostwu' );
  var obj2 = new Singleton( 'ghostwu2' );
  console.log( obj1 === obj2 ); //false

每次new都会在内存中生成一块新的内存区域保存新的实例,所以这种方式就不能保证只能new出一个单例,所以,我们想要创建一个单例,就要能够控制new创建实例的过程!!!,这就是单例的关键,那么要控制这个过程,肯定不能让用户直接调用构造函数,所以我们要另外想办法.

第一种办法: 在函数中添加一个静态方法,来控制创建实例的过程

function Singleton ( uName ){
   this.userName = uName;
  }
  Singleton.prototype.showUserName = function(){
   return this.userName;
  }
  Singleton.getInstance = function( uName ){
   if ( !this.ins ) {
    this.ins = new Singleton( uName );
   }
   return this.ins;
  }

  var obj1 = Singleton.getInstance( 'ghostwu' );
  var obj2 = Singleton.getInstance( 'ghostwu2' );
  console.log( obj1 === obj2 ); //true

第8行判断ins这个变量是否保存了一个实例,如果没有就new一个,否则直接返回。第二次在调用的时候,由于已经存在了ins,所以直接返回,就不需要在new了,这要就能确保是单例

第二种办法:利用闭包和立即表达式的特性

function Singleton ( uName ){
   this.userName = uName;
  }
  Singleton.prototype.showUserName = function(){
   return this.userName;
  }
  Singleton.getInstance = (function(){
   var ins = null;
   return function( uName ) {
    if ( !ins ) {
     ins = new Singleton( uName );
    }
    return this;
   }
  })();

  var obj1 = Singleton.getInstance( 'ghostwu' );
  var obj2 = Singleton.getInstance( 'ghostwu2' );
  console.log( obj1 === obj2 );

这两种方法都可以,接下来,我就选择第二种方法来实现弹出单一的模态框

三、传统面向对象方式,每次点击都会弹出新的模态框

样式:

div {
   width: 200px;
   height: 200px;
   border:1px solid #09f;
   box-shadow: 2px 2px 1px #666;
   position: absolute;
  }

html:

<input type="button" value="弹窗">

js部分:

var oBtn = document.querySelector("input"),
   offset = 20, index = 1;
  function Module( pos ){
   this.offset = pos || 20;
  }
  Module.prototype.create = function(){
   var oDiv = document.createElement( "div" );
   oDiv.style.left = ( ++index ) * offset + 'px';
   oDiv.style.top = ( ++index ) * offset + 'px';
   oDiv.innerHTML = 'ghostwu教你用设计模式实战';
   return oDiv;
  }
  oBtn.onclick = function(){
   var oDiv = new Module();
   document.body.appendChild( oDiv.create() );
  }

[js高手之路]单例模式实现模态框的示例

四,用单例改造

html:

<input type="button" value="弹窗1">
<input type="button" value="弹窗2">
var aBtn = document.querySelectorAll("input"),
   offset = 20, index = 1;
  function Module( pos ){
   this.offset = pos || 20;
  }
  Module.prototype.create = function(){
   var oDiv = document.createElement( "div" );
   oDiv.style.left = ( ++index ) * offset + 'px';
   oDiv.style.top = ( ++index ) * offset + 'px';
   oDiv.innerHTML = 'ghostwu教你用设计模式实战';
   return oDiv;
  }
  Module.one = (function(){
   var ins = null, isExist = false;
   return function( pos ){
    if ( !ins ) ins = new Module( pos );
    if ( !isExist ) {
     document.body.appendChild( ins.create() );
     isExist = true;
    }
   }
  })();
  aBtn[0].onclick = function(){
   Module.one( 10 );
  }
  aBtn[1].onclick = function(){
   Module.one( 10 );
  }

在Module.one中通过变量isExist的两种状态和闭包特性控制元素只能被添加一次

以上这篇[js高手之路]单例模式实现模态框的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 淡出一个图像到另一个图像的实现代码
Jun 12 Javascript
JQuery实现table行折叠效果以JSON做数据源
May 26 Javascript
简述JavaScript的正则表达式中test()方法的使用
Jun 16 Javascript
canvas学习之API整理笔记(一)
Dec 29 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
Jan 15 Javascript
javascript 正则表达式去空行方法
Jan 24 Javascript
Vue2 使用 Echarts 创建图表实例代码
May 18 Javascript
JS实现的全排列组合算法示例
Oct 09 Javascript
jQuery中复合选择器简单用法示例
Mar 31 jQuery
详解JavaScript的BUG和错误
May 07 Javascript
基于vue展开收起动画的示例代码
Jul 05 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
Feb 28 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
Sep 01 #jQuery
详解使用angular的HttpClient搭配rxjs
Sep 01 #Javascript
JS中关于正则的巧妙操作
Aug 31 #Javascript
JavaScript表单即时验证 验证不成功不能提交
Aug 31 #Javascript
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 #Javascript
js实现canvas图片与img图片的相互转换的示例
Aug 31 #Javascript
vue实现全选和反选功能
Aug 31 #Javascript
You might like
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
Python文件操作函数用法实例详解
2019/12/24 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
linux面试题参考答案(4)
2014/09/21 面试题
文明工地标语
2014/06/16 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS