什么是单例呢?

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

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

  1. function Singleton ( uName ){
  2. this.userName = uName;
  3. this.ins = null;
  4. }
  5. Singleton.prototype.showUserName = function(){
  6. return this.userName;
  7. }
  8. var obj1 = new Singleton( 'ghostwu' );
  9. var obj2 = new Singleton( 'ghostwu2' );
  10. console.log( obj1 === obj2 ); //false

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

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

  1. function Singleton ( uName ){
  2. this.userName = uName;
  3. }
  4. Singleton.prototype.showUserName = function(){
  5. return this.userName;
  6. }
  7. Singleton.getInstance = function( uName ){
  8. if ( !this.ins ) {
  9. this.ins = new Singleton( uName );
  10. }
  11. return this.ins;
  12. }
  13.  
  14. var obj1 = Singleton.getInstance( 'ghostwu' );
  15. var obj2 = Singleton.getInstance( 'ghostwu2' );
  16. console.log( obj1 === obj2 ); //true

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

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

  1. function Singleton ( uName ){
  2. this.userName = uName;
  3. }
  4. Singleton.prototype.showUserName = function(){
  5. return this.userName;
  6. }
  7. Singleton.getInstance = (function(){
  8. var ins = null;
  9. return function( uName ) {
  10. if ( !ins ) {
  11. ins = new Singleton( uName );
  12. }
  13. return this;
  14. }
  15. })();
  16.  
  17. var obj1 = Singleton.getInstance( 'ghostwu' );
  18. var obj2 = Singleton.getInstance( 'ghostwu2' );
  19. console.log( obj1 === obj2 );

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

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

样式:

  1. div {
  2. width: 200px;
  3. height: 200px;
  4. border:1px solid #09f;
  5. box-shadow: 2px 2px 1px #666;
  6. position: absolute;
  7. }

html:

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

js部分:

  1. var oBtn = document.querySelector("input"),
  2. offset = 20, index = 1;
  3. function Module( pos ){
  4. this.offset = pos || 20;
  5. }
  6. Module.prototype.create = function(){
  7. var oDiv = document.createElement( "div" );
  8. oDiv.style.left = ( ++index ) * offset + 'px';
  9. oDiv.style.top = ( ++index ) * offset + 'px';
  10. oDiv.innerHTML = 'ghostwu教你用设计模式实战';
  11. return oDiv;
  12. }
  13. oBtn.onclick = function(){
  14. var oDiv = new Module();
  15. document.body.appendChild( oDiv.create() );
  16. }

四,用单例改造

html:

  1. <input type="button" value="弹窗1">
  2. <input type="button" value="弹窗2">
  1. var aBtn = document.querySelectorAll("input"),
  2. offset = 20, index = 1;
  3. function Module( pos ){
  4. this.offset = pos || 20;
  5. }
  6. Module.prototype.create = function(){
  7. var oDiv = document.createElement( "div" );
  8. oDiv.style.left = ( ++index ) * offset + 'px';
  9. oDiv.style.top = ( ++index ) * offset + 'px';
  10. oDiv.innerHTML = 'ghostwu教你用设计模式实战';
  11. return oDiv;
  12. }
  13. Module.one = (function(){
  14. var ins = null, isExist = false;
  15. return function( pos ){
  16. if ( !ins ) ins = new Module( pos );
  17. if ( !isExist ) {
  18. document.body.appendChild( ins.create() );
  19. isExist = true;
  20. }
  21. }
  22. })();
  23. aBtn[0].onclick = function(){
  24. Module.one( 10 );
  25. }
  26. aBtn[1].onclick = function(){
  27. Module.one( 10 );
  28. }

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

[js高手之路]设计模式系列课程-单例模式实现模态框的更多相关文章

  1. [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

    所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...

  2. [js高手之路] 设计模式系列课程 - jQuery的extend插件机制

    这里在之前的文章[js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数基础上增加一个extend浅拷贝,可以为对象方便的扩展属性和方法, jquery的插件扩展机制,大致就是这 ...

  3. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  4. [js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数

    一.我们从一个简单的构造函数+原型程序开始 var G = function(){}; G.prototype = { length : 5, size : function(){ return th ...

  5. [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库

    模块化的诞生标志着javascript开发进入工业时代,近几年随着es6, require js( sea js ), node js崛起,特别是es6和node js自带模块加载功能,给大型程序开发 ...

  6. [js高手之路]设计模式系列课程-委托模式实战微博发布功能

    在实际开发中,经常需要为Dom元素绑定事件,如果页面上有4个li元素,点击对应的li,弹出对应的li内容,怎么做呢?是不是很简单? 大多数人的做法都是:获取元素,绑定事件 <ul> < ...

  7. [js高手之路] 设计模式系列课程 - DOM迭代器(2)

    如果你对jquery比较熟悉的话,应该用过 eq, first, last, get, prev, next, siblings等过滤器和方法.本文,我们就用迭代设计模式来封装实现,类似的功能 < ...

  8. [js高手之路] 设计模式系列课程 - 迭代器(1)

    迭代器是指通过一种形式依次遍历数组,对象,或者类数组结构中的每个元素. 常见的有jquery中的each方法, ES5自带的forEach方法. 下面我们就来自定义一个类似jquery或者ES5的迭代 ...

  9. [js高手之路] es6系列教程 - 迭代器与生成器详解

    什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...

随机推荐

  1. 20170709_python_学习记录

    a='ABC';变量赋值时发生了什么 1.在内存中创建一个字符串'ABC' 2.在内存中创建一个变量a指向字符串'ABC' list [] 相当于数组 指向可以变动 str[1,2,3,4] str. ...

  2. nyoj_16:矩形嵌套

    DAG上的动态规划 小技巧:max_element(a, a+n)返回的是数组a从下标0的位置到下标n-1的位置中的n个元素中最大元素的地址. 题目链接: http://acm.nyist.net/J ...

  3. bash脚本编程---循环

    bash为过程式编程语言 代码执行顺序: 1.顺序执行:逐条执行 2.选择执行:代码有一个分支,条件满足时才会执行                       两个或以上的分支,只会执行其中一个满足条 ...

  4. Web Service--第一次接触web service

    Web Service 首发于开源中国 1. 背景 中国移动短信网关需求,要能够发送短信.开发材料只有一个短信发送配置:包括ID,password,code,url.一个jar包还有一个老旧的html ...

  5. 【CSS3】使用CSS3线性渐变实现图片闪光划过效果(转)

    原文:http://www.nowamagic.net/librarys/veda/detail/2600 资料参考: http://www.cnblogs.com/lhb25/archive/201 ...

  6. SMS Error code: +CMS

    Error  Description CMS ERROR: 1 Unassigned number CMS ERROR: 8 Operator determined barring CMS ERROR ...

  7. HDU 2202 最大三角形(凸包)

    Problem Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy ...

  8. 使用Node.js调用阿里云短信的发送以及接收

    为了使用Node.js调用阿里云短信服务,我自己写了个npm包, 目前实现了: 使用Node.js调用阿里云短信服务,发送短信: 使用Node.js调用阿里云短信服务以及MNS服务,接收用户上行短信 ...

  9. Django 最好的缓存memcached的使用 小记

    嗯,咳咳咳咳咳,这是在win平台上.linux平台上没折腾 首先你要在win上安装 Memcache 下载 :点我下载 里面有x64 和 x86 的.根据自己的系统版本来选择使用   使用命令行: 1 ...

  10. ios发送邮件

    方法一: 1.需要引入库MessageUI.framework #import <MessageUI/MessageUI.h> #import<MessageUI/MFMailCom ...