[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 相关文章推荐
javascript 闭包疑问
Dec 30 Javascript
jQuery事件绑定.on()简要概述及应用
Feb 07 Javascript
input禁止键盘及中文输入,但可以点击
Feb 13 Javascript
在父页面得到zTree已选中的节点的方法
Feb 12 Javascript
JS实现点击按钮获取页面高度的方法
Nov 02 Javascript
BootStrap Table对前台页面表格的支持实例讲解
Dec 22 Javascript
javascript ASCII和Hex互转的实现方法
Dec 27 Javascript
jQuery实现链接的title快速出现的方法
Feb 20 Javascript
ES6新特性之Symbol类型用法分析
Mar 31 Javascript
js 获取json数组里面数组的长度实例
Oct 31 Javascript
vue2.0项目集成Cesium的实现方法
Jul 30 Javascript
js实现验证码干扰(静态)
Feb 22 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
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
PHP缓冲区用法总结
2016/02/14 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
Javascript图像处理思路及实现代码
2012/12/25 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
javascript实现点击星星小游戏
2019/12/24 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
浅谈Python实现Apriori算法介绍
2017/12/20 Python
python中kmeans聚类实现代码
2018/02/23 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
香港礼品网站:GiftU eshop
2017/09/01 全球购物
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
一些Solaris面试题
2013/03/22 面试题
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
八一慰问活动方案
2014/02/07 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
九一八事变演讲稿
2014/09/05 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
办公室主任岗位职责
2015/01/31 职场文书
放假通知
2015/04/14 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
MySQL数据库 安全管理
2022/05/06 MySQL
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android