前言

和其他编程语言一样,Javascript同样拥有着很多种设计模式,比如单例模式、代理模式、观察者模式等,熟练运用Javascript的设计模式可以使我们的代码逻辑更加清晰,并且更加易于维护和重构。

本文将介绍Javascript模式中较为常见和实用的模式——单例模式,主要分为概念和实例部分。在介绍实例的同时也会对代码中额外的知识点进行讲解。

单例模式概念

首先什么是单例模式?可以这样理解:单例模式旨在保证一个类仅有一个实例,并提供一个全局的访问点。

可能有人还是不太理解单例的概念,那么你可以想象生活中的一些例子。比如注册账号的时候,如果我们注册的账号已经存在,那么系统会提示我们“账号已经存在是否使用该账号登陆”,我们无法再次创建一个一模一样的账号,除非把原账号注销。这就是单例模式的生动体现。

类似的例子还有网页上的登陆弹框,无论我们点击多少次登陆按钮,界面上始终只会显示一个登陆弹框,无法再创建第二个。

本文就将以登陆弹框为例介绍单例模式的使用方式。

单例模式实例

1.demo展示

演示地址为:弹框实例

2.代码展示

构建单例模式弹框实例的代码每个人可能写的都不一样,但是目的都是一个:构建一个全局唯一并可访问的弹框。接下来我们一步一步来实现这个例子。

(1)获取DOM对象

var $ = function(id) {return typeof id === 'string' ? document.getElementById(id) : id;
};

首先为了便于之后关于DOM的一些操作,我们这里利用函数式编程的原理将获取目标id的元素对象方法封装了一下,直接利用$(id)就可以获取。

(2)弹框构造函数

var Modal = function(id, html) {this.html = html;this.id = id;this.open = false;
};

这里我们声明了一个Modal作为弹框的构造函数,并且再其内部定义了公有属性html、id和open。html用来定义弹框内部的内容,id用来给弹框定义id名称,open用于判断弹框是否打开。

(3)open方法

Modal.prototype.create = function() {if (!this.open) {var modal = document.createElement('div');modal.innerHTML = this.html;modal.id = this.id;document.body.appendChild(modal);setTimeout(function() {modal.classList.add('show');}, 0);this.open = true;}
};

我们在Modal的原型链上定义了create方法,方法内部我们创建并向DOM中插入弹框,同时给弹框加上一个class为”show”的动画效果。这里简单介绍下classList:

classList是一个比className更便捷的操作元素class的属性,不过在兼容性方面不兼容IE10以下版本:

其提供的操作class方法和jQuery的类似,主要有

  • add(class1, class2, …) 在元素中添加一个或多个类名,类似jQuery的addClass()
  • remove(class1, class2, …) 移除元素中一个或多个类名,类似jQuery的removeClass()
  • contains(class) 判断指定的类名是否存在,类似jQuery的hasClass()

这里我们用到了add方法给Modal添加show类。

(4)close方法

Modal.prototype.delete = function() {if (this.open) {var modal = $(this.id);modal.classList.add('hide'); setTimeout(function() {document.body.removeChild(modal);}, 200);this.open = false;}
};

定义了open方法后我们这里定义关闭弹框的方法,在其内部给弹框对象添加hide类动画效果,最后在页面上移除弹框对象。

(5)创建实例

var createIntance = (function() {var instance;return function() {return instance || (instance = new Modal('modal', '这是一个弹框'))}
})();

这是实现单例模式的重要部分,我们来分析下知识点:

  1. 使用闭包封装了instance私有变量并返回一个函数
  2. 利用 || 语法判断如果instance不存在则执行后者的实例化Modal方法,存在则直接返回instance,确保了只存在一个弹框实例

本实例的创建也可以理解为代理模式的一部分。

(6)按钮操作

var operate = {setModal: null,open: function() {this.setModal = createIntance();this.setModal.create();},delete: function() {this.setModal ? this.setModal.delete() : '';}
};

这里我们将按钮操作放在operate对象里,使得打开和关闭操作可以通过this获取实例setModal。

(7)绑定事件

$('open').onclick = function() {operate.open();
};$('delete').onclick = function() {operate.delete();
};

最后我们将打开和删除方法绑定到两个按钮上去,至此我们用单例模式实现的弹框demo就实现了。

完整代码请查看:完整代码

结语

本文只演示了单例模式的一种实现方式,至于如何构建一个通用的单例模式就交给有兴趣的读者了。

文章灵感来源于《Javascrit设计模式与开发实践》一书。

转载于:https://www.cnblogs.com/luozhihao/p/5924057.html

Javascript单例模式概念与实例相关推荐

  1. js基础--javascript基础概念之函数

    js基础--javascript基础概念之函数 引用w3c介绍: 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用 ...

  2. php单例模式的实例,PHP的单例模式的一个实例_php

    这篇文章对于php单例模式的解释并不一定完善!只是举一个实例而已,目的是让我自己通过一个实例可以加深对单例模式的理解!在此,仅供参考! 单例:可以简单的理解是通过一个类,只能实例化单个对象,不能实例化 ...

  3. javascript 调用c#变量实例

    javascript 调用c#变量实例 www.firnow.com 时间:2008-02-01 作者:佚名 编辑:本站 点击: 437 [评论] 分两步: 1. asp.net 页面类中 publi ...

  4. 论文浅尝 | 区分概念和实例的知识图谱嵌入方法

    链接:https://arxiv.org/pdf/1811.04588.pdf 知识图谱的表示学习最近几年被广泛研究,表示学习的结果对知识图谱补全和信息抽取都有很大帮助.本文提出了一种新的区分概念和实 ...

  5. 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较

    前言:上一节提到IPC的概述,本一节,原文作者比较详细的讨论了,管道的概念和实例和使用场景: 原文作者:郑彦兴 (mlinux@163.com)国防科大计算机学院 http://www.ibm.com ...

  6. javascript中构造StringBuffer实例

    javascript中构造StringBuffer实例 function StringBuffer(){       this.strings = new Array;   }     StringB ...

  7. java编译不报错但运行啥都没_java编译时与运行时概念与实例详解

    java编译时与运行时概念与实例详解 发布于 2020-7-29| 复制链接 本篇文章通过实例对 java程序编译时与运行时进行了详解,需要的朋友可以参考下 Java编译时与运行时很重要的概念,但是一 ...

  8. 沐阳Python扫盲01类的概念与实例

    沐阳Python扫盲01类的概念与实例 文章目录 沐阳Python扫盲01类的概念与实例 前言 一.面向过程编程的实现 二.面向对象编程的实现 总结 前言 让我们从一个实际的游戏人物例子出发,学习理解 ...

  9. php 生成斜体字,JavaScript italics方法入门实例(把字符串显示为斜体)

    这篇文章主要介绍了JavaScript italics方法入门实例,italics方法用于把字符串显示为斜体,需要的朋友可以参考下 JavaScript italics 方法 italics 方法返回 ...

  10. web前端期末大作业 ~我的家乡-绿城之都html+css+javascript旅游网页设计实例

    web前端期末大作业 ~ 我的家乡-绿城之都html+css+javascript旅游网页设计实例 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页 ...

最新文章

  1. 算法题解:对于输入数字串,给出另一种数字排列,使得字典序增加尽可能小...
  2. python与c语言在语法上的区别-C语言和Python编程先学习哪个
  3. python中str的索引、切片
  4. HDFS HA介绍及配置理解
  5. 数字后端——时钟树综合
  6. python可以做科学计算吗_python能做什么科学计算
  7. GHOSTXP_SP3
  8. Linux信息显示命令,Linux常用信息显示命令
  9. Java:类与对象概念
  10. matlab命令及海洋作图
  11. 设计开发-API代付系统/自动代付系统
  12. python短时傅里叶变换_Python scipy 计算短时傅里叶变换(Short-time Fourier transforms)...
  13. Zero-Shot Deep Domain Adaptation[reading notes]
  14. CAD软件中怎么合并表格?CAD表格合并技巧
  15. SpringBoot启动报错:Parameter 0 of method hmset in com.qcby.rbac.util.RedisUtils required a bean of type
  16. python 兼职多少钱一小时_无印良品兼职一小时多少钱?看完后就清楚了!
  17. No suitable application records were found. Verify your bundle identifi
  18. 昨天搭完梯子之后就打不开12306查询的网页了
  19. Homebrew 无法下载安装文件的解决方法
  20. 重磅!《中国迈向新一代人工智能》全文来了。道翰天琼认知智能平台为您揭秘新一代人工智能-1。

热门文章

  1. koa2 session mysql_koa2+vue+axios搭建一个博客台管理系统之session踩坑
  2. 用Neo4j图形数据库打造专属于你的高bigger关系图
  3. PSi-Population Stability Index (PSI)模型分稳定性评估指标
  4. SLAM--位姿图优化和PnP求解
  5. c++线程类 linux,C++进阶学习——线程基类的设计(Linux)
  6. linux由哪些部分组成,linux内核处于什么位置?,Linux由几部分组成?Linux系统结构介绍!...
  7. swift5的下标Subscripts 花式玩法
  8. JAVA常见的异常6_Java常见异常总结
  9. html5的file api,HTML5 File API
  10. Brinson归因模型