当前位置:首页 > 日记 > 正文

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

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

什么是单例呢?

单,就是一个的意思。例:就是实例化出来的对象,那合在一起就是保证一个构造函数只能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() );  }

四,用单例改造

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高手之路]单例模式实现模态框的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

相关文章

ajax异步请求刷新

ajax异步请求刷新

刷新,异步请求,电脑软件,ajax,在网站刷新的方法中,ajax刷新是一种用户体验良好的刷新方式,在结合ssh等流行的框架!最为常用了!下面就是常用一个ajax刷新表单的一个demo.$(document).ready(function () { testchaxun(); setInterval("testch…

JS设置CSS样式的方式汇总

JS设置CSS样式的方式汇总

设置,样式,方式,电脑软件,JS,1. 直接设置style的属性 某些情况用这个设置 !important值无效如果属性有'-‘号,就写成驼峰的形式(如textAlign) 如果想保留 - 号,就中括号的形式 element.style[‘text-align'] = ‘100px';element.style.he…

css和js实现弹出登录居中界面完整

css和js实现弹出登录居中界面完整

界面,登录,弹出,完整,代码,我实现的这个和许多网站上的登录弹出窗口差不多,大家举一反三,先看我写完后的结果。点击创建相册后会在这个屏幕的中间显示创建相册的表单,整个背景颜色变暗,点击右上角的X会关闭这个表单。html代码创建按钮<li id="…

纯js实现页面返回顶部的动画 | 超

纯js实现页面返回顶部的动画 | 超

动画,返回顶部,页面,简单,电脑软件,废话不多说,直接上代码var scrollTop = document.body.scrollTop; document.body.style.marginTop = -scrollTop + 'px'; document.body.scrollTop = 0; document.body.style.transition = 'all 1s …

PHP和Java的主要区别有哪些?哪个最

PHP和Java的主要区别有哪些?哪个最

开发语言,最适合,区别,有哪些,电脑软件,一、前言PHP和Java都是现在比较流行的二种编程语言。对于许多新手来说,都会思考如果学的时候,该学哪种语言呢?下面这篇文章给大家整理两者的区别以及一些选择建议,一起来看看吧。二、简介PHP与Java作为两…

在原生不支持的旧环境中添加兼容的

在原生不支持的旧环境中添加兼容的

方法,原生,不支持,环境,电脑软件,如下所示:if (!Object.keys) { Object.keys = (function () { var hasOwnProperty = Object.prototype.hasOwnProperty, //原型上的方法,只取自身有的属性; hasDontEnumBug = !({toString: null}).propert…

捕获未处理的Promise错误方法

捕获未处理的Promise错误方法

方法,错误,未处理,电脑软件,Promise,为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。使用Promise编写异步代码时,使用reject来处理错误。有时,开发者通常会忽略这一点,导致一些错误…

如何在word中插入封面

如何在word中插入封面

封面,如何在,电脑软件,word,  有时候在word文档中需要好看的封面,但是我们又不知道怎么弄,那就选择在word里面寻找吧,在下面就由小编给大家分享下在word中添加封面的技巧,希望能帮助到您。在word中添加封面的步骤如下:  步骤一:选择需要插入…

photoshop简单制作漂亮的翡翠立体

photoshop简单制作漂亮的翡翠立体

文字,漂亮,简单,电脑软件,photoshop,今天小编就为大家介绍怎样用photoshop制作漂亮的翡翠立体文字方法,推荐到,喜欢的朋友可以参考本文,希望能对大家有所帮助!1、打开你的ps软件,新建一个800*600., 72像素的文件。2、打上你想要做的文字。我这里…

ps中性灰商业人像后期精修教程

ps中性灰商业人像后期精修教程

教程,人像,后期,电脑软件,ps,后期思路:主要使用&ldquo;中性灰&rdquo;对人物的皮肤进行修饰、立体化的强化以及五官的修饰。毛发,眼珠也是重点。效果对比:经过后期精修之后,效果简单的呈现出来,放一张对比图,做完之后发现颌骨的位置有所瑕疵。教程…

PS滤镜高反差怎么处理?

PS滤镜高反差怎么处理?

滤镜,反差,怎么处理,电脑软件,PS,ps怎么使用高反差滤镜呢?我们举一个简单的例子来看看这个滤镜的效果,详细内容请看下文详细介绍。软件名称:Adobe photoshop 7.01 官方正式简体中文版软件大小:154MB更新时间:2013-04-191、打开一个PS的软件,然后…

angularjs中的$eval方法详解

angularjs中的$eval方法详解

方法,详解,电脑软件,angularjs,eval,在controller中定义了一个变量$scope.a_1 = "abc";想在view里面动态输出,因为这个数字是动态的,这么输出肯定是不行的{{'a_' + '1'}},因为输出来的是a_1这个字符串,而不是a_1这个变量的值想输出a_1这…