[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 相关文章推荐
新发现一个骗链接的方法(js读取cookies)
Jan 11 Javascript
js获取url中&quot;?&quot;后面的字串方法
May 15 Javascript
jQuery中[attribute=value]选择器用法实例
Dec 31 Javascript
javascript手工制作悬浮菜单
Feb 12 Javascript
深入学习JavaScript中的Rest参数和参数默认值
Jul 28 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
Nov 18 Javascript
js实现网页定位导航功能
Mar 07 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
Apr 03 jQuery
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
JS工厂模式开发实践案例分析
Oct 17 Javascript
vue监听dom大小改变案例
Jul 29 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
Sep 21 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
jquery获取节点名称
2015/04/26 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
python 布尔操作实现代码
2013/03/23 Python
Python中的装饰器用法详解
2015/01/14 Python
python做接口测试的必要性
2019/11/20 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
python Timer 类使用介绍
2020/12/28 Python
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
餐饮总经理岗位职责
2014/03/07 职场文书
市场开发与营销专业求职信范文
2014/05/01 职场文书
计算机毕业生求职信
2014/06/10 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
合作意向协议书
2015/01/29 职场文书
大二学年个人总结
2015/03/03 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python