一、了解单例模式

单例模式的定义:保证一个类仅有一个实例,并提供一个访问他的全局访问点

单例模式的核心:是确保只有一个实例,并提供全局访问

二、javascript中的单例模式

在js中,我们经常会把全局变量当做单例模式来使用,例如:

var a={};

为什么a可以当做全局变量来使用呢,因为其满足以下两个条件:

1、对象a独一无二

2、a定义在全局作用域下,提供了全局访问

注:但是在js中建议使用命名空间,来减少全局变量的数量

三、惰性单例

惰性单例:在需要的时候才创建的对象实例

用途:在页面中有两个按钮,点击的时候需要显示响应弹窗并加载相应的css文件

注:有些开发人员习惯在页面加载时就写进去,然后设置隐藏状态,这样就会浪费DOM节点

下面是实现代码:

1、主页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>单例模式</title><style type="text/css">body{background: #fffff2;}h3{text-align: center;}</style></head><body><h3>创建唯一的窗口</h3><button type="button" id="btn1">创建div1</button><button type="button" id="btn2">创建div2</button>
</body><script type="text/javascript">/*** 管理单例*/var getSingle=function(fn){var result;return function(){return result || (result=fn.apply(this,arguments));}};// 弹框关闭打开function LayerAction(){this.layer=null;//弹窗elementif(typeof this.setLayer !== "function"){// 设置弹窗LayerAction.prototype.setLayer=function(layer){if(!layer){console.error("参数不完整,必须传入layer");return;}else{this.layer=layer;}};// 显示弹窗LayerAction.prototype.showLayer=function(){this.layer.style.display="block";};// 关闭弹窗LayerAction.prototype.closeLayer= function(){this.layer.style.display="none";} ;}}/*** div1弹窗*/var div1={div1Layer:null,layerAction: new LayerAction(),// 创建div1弹窗createDiv1Layer:function(){var div=document.createElement("div");div.innerHTML="我是div1";div.style.display='none';div.id="div1";document.body.appendChild(div);var closeBtn=document.createElement("span");closeBtn.innerText="关闭";closeBtn.id="closeDiv1";div.appendChild(closeBtn);return div;},// 引入div1弹窗样式列表createDiv1Style: function() {var styleElement = document.createElement('link');styleElement.type = 'text/css';styleElement.href = 'div1.css';styleElement.rel = 'stylesheet';document.getElementsByTagName('head')[0].appendChild(styleElement);console.log(document.getElementsByTagName('head')[0].innerHTML);return styleElement},// 为关闭按钮绑定事件bindActionForCloseLayer: function(){var that=div1;document.getElementById("closeDiv1").οnclick=function(){that.layerAction.closeLayer();}},// 调用弹窗1startDiv1Layer: function(){var createDiv1singleLayer=getSingle(this.createDiv1Layer);var createDiv1singleStyle=getSingle(this.createDiv1Style);var bindCloseEvent=getSingle(this.bindActionForCloseLayer);var that=this;document.getElementById("btn1").οnclick=function(){createDiv1singleStyle();that.div1Layer=createDiv1singleLayer();that.layerAction.setLayer(that.div1Layer);that.layerAction.showLayer();bindCloseEvent();}}};div1.startDiv1Layer();/*** div2弹窗*/var div2={div2Layer:null,layerAction: new LayerAction(),// 创建div2弹窗createDiv2Layer: function(){var div=document.createElement("div");div.innerHTML="我是div2";div.style.display='none';div.id="div2";document.body.appendChild(div);var closeBtn=document.createElement("span");closeBtn.innerText="关闭";closeBtn.id="closeDiv2";div.appendChild(closeBtn);return div;},// 引入div2弹窗样式列表createDiv2Style: function () {var styleElement = document.createElement('link');styleElement.type = 'text/css';styleElement.href = 'div2.css';styleElement.rel = 'stylesheet';document.getElementsByTagName('head')[0].appendChild(styleElement);console.log(document.getElementsByTagName('head')[0].innerHTML);return styleElement},// 为关闭按钮绑定事件bindActionForCloseLayer: function(){var that=div2;document.getElementById("closeDiv2").οnclick=function(){that.layerAction.closeLayer();}},// 调用弹窗2startDiv2Layer: function(){var createDiv2singleLayer=getSingle(this.createDiv2Layer);var createDiv2singleStyle=getSingle(this.createDiv2Style);var bindCloseEvent=getSingle(this.bindActionForCloseLayer);var that=this;document.getElementById("btn2").οnclick=function(){createDiv2singleStyle();that.div2Layer=createDiv2singleLayer();that.layerAction.setLayer(that.div2Layer);that.layerAction.showLayer();bindCloseEvent();}}}div2.startDiv2Layer();</script></html>

2、div1.css

/*** Description: * Created by wxy on 2018/2/13 11:02*/#div2{width: 500px;height: 300px;background: #ffdd00;color: #fff;position: fixed;top: 50%;left: 50%;transform: translate(-50%,-50%);
}#closeDiv2{cursor: pointer;margin-right: 5px;margin-top: 5px;float: right;border: 1px solid #fff;
}

3、div2.css

/*** Description: style of div1* Created by wxy on 2018/2/13 11:01*/#div1{width: 500px;height: 300px;background: #0b0a0a;color: #fff;position: fixed;top: 50%;left: 50%;transform: translate(-50%,-50%);
}
#closeDiv1{cursor: pointer;margin-right: 5px;margin-top: 5px;float: right;border: 1px solid #fff;
}

js单例模式——创建弹窗相关推荐

  1. js单例模式及应用场景

    单例模式 单例就是保证一个类只有一个实例,实现方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例作为一个命名空间 ...

  2. android注册弹窗,Android开发之PopupWindow创建弹窗、对话框的方法详解

    本文实例讲述了Android开发之PopupWindow创建弹窗.对话框的方法.分享给大家供大家参考,具体如下: 简介: PopupWindow 可创建类似对话框风格的窗口 效果: 使用方法: 使用P ...

  3. [译] 使用 Web3 和 Vue.js 来创建你的第一个以太坊 dAPP(第二部分)

    原文地址:Create your first Ethereum dAPP with Web3 and Vue.JS (Part 2) 原文作者:Alt Street 译文出自:掘金翻译计划 本文永久链 ...

  4. js动态生产html元素,js 动态创建 html元素

    js 动态创建 html元素 js学习之动态创建html元素 body{margin:0;padding:0;} .sky{background:#000;width:1000;height:500p ...

  5. php 右下脚弹窗,纯js的右下角弹窗实例代码

    下面小编就为大家带来一篇纯js的右下角弹窗实例代码.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 这个弹窗是如下图的效果: 打开网页的时候,这个弹窗会淡入,之后点击右上 ...

  6. ENSP如何开启服务器的http_如何使用HTTP模块在Node.js中创建Web服务器(上)

    当你在浏览器中查看网页时,其实是在向互联网上的另一台计算机发出请求,然后它会将网页提供给你作为响应.你通过互联网与之交谈的那台计算机就是Web服务器,Web服务器从客户端(例如你的浏览器)接收HTTP ...

  7. js中创建form表单

    有的时候需要在js中创建form向controller提交数据,下面是在工作中遇到的一些问题和解决办法: 简单的用jquery创建form: var form = $("<form m ...

  8. draft.js_如何使用快捷方式在Draft.js中创建有序列表和无序列表

    draft.js by Andrey Semin 通过安德烈·塞米(Andrey Semin) 如何使用快捷方式在Draft.js中创建有序列表和无序列表 (How to create ordered ...

  9. html div 移除,js动态创建及移除div的方法

    本文实例讲述了js动态创建及移除div的方法.分享给大家供大家参考.具体实现方法如下: //创建div function createDiv(){ if(document.getElementById ...

最新文章

  1. linux 版本 arch,Arch Linux是什么
  2. do...while(0)的妙用
  3. OK335xS dhcpcd porting
  4. [软件]Beyond Compare
  5. 安卓9去掉搜索栏_android9.0隐藏虚拟按键跟状态栏,除去google搜索栏.
  6. 云服务器如何清理垃圾释放空间?
  7. CentOS镜像中替换安装镜像的小系统的内核方法
  8. php 后端服务错误定义,【后端开发】php常见的错误类型有哪四种
  9. VS2012 有效注册密钥(截止到2016/9/27仍有效)
  10. 企业集成平台与SOA架构
  11. 下载c语言软件在哪里,下载c语言编程软件-c语言编程软件去哪里下?c语言编程软件去哪 – 手机爱问...
  12. 数据创造价值,数据分析主要为哪几步?
  13. react.createContext
  14. mac系统恢复服务器上的安装器损坏,Mac提示App已损坏你应该将它移到废纸篓的解决方案-mac无法安装软件解决教程 - 河东软件园...
  15. Android 网络框架 Retrofit2.0介绍、使用和封装
  16. java压缩解压缩rar、zip文件
  17. (1)英特尔工业边缘洞见平台(EII)安装指南
  18. 信创云“华山论剑” 五强鼎力谁与争锋?
  19. 进制之间的快速转换法:8421码及原码反码补码之间的相互转换关系
  20. Python---数据分析---绘制条形图---横竖条形图

热门文章

  1. qm13662 复制_速看!GB/T 13662-2018《黄酒》标准解读
  2. 2022-2028全球一体式马桶行业调研及趋势分析报告
  3. 北京纪行之一:书店印象
  4. linux移动当前文件夹下的前几个文件到其他文件夹下
  5. Spring之控制反转
  6. Stripe支付流程简要描述
  7. 阿里云RDS——产品系列概述
  8. Bing必应地图中国API - 在地图上画圆
  9. 游戏夜读 | 不受欢迎的那个人
  10. 分布式任务调度项目xxl-job