单例介绍

上次总结了设计模式中的module模式,可能没有真真正正的使用在场景中,发现效果并不好,想要使用起来却不那么得心应手,

所以这次我打算换一种方式~~从简单的场景中来看单例模式,

因为JavaScript非常灵活,所以在使用设计模式的时候也带来了很强的灵活性,实现单例的方法也有很多,那就需要我们把握住单例模式的核心。


单例模式介绍:

单例模式是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。

在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象

作用:

  1、模块间通信

  2、系统中某各类的对象只能存在一个

  3、保护自己的属性和方法,保证了所有的对象访问的都是同一个实例

注意事项:

  1、注意this的使用

  2、闭包容易造成内存泄露,不需要的尽快处理等待回收

简单场景

我们先来实现一个标准的单例模式:

  1、如果实例存在就返回,实例不存在就创建新实例;

  2、从全局命名空间中隔离出代码,从而为函数提供单一访问点:

        var mySingleton = (function () {
// 实例保持Singleton的一个引用
let instance; // Singleton
// 私有方法和变量
function init() {
function privateMethod() {
console.log('I am private');
}
const privateVariable = ' I am also private ';
const privateRandomNumber = Math.random();
// 公有方法和变量
return {
publicMethod:function(){
console.log('I am public');
},
getRandomNumber:function(){
return privateRandomNumber;
}
}
} // 获取Singleton实例,如果存在就返回,不存在就创建新实例
return {
getInstance:function(){
if(!instance){
instance = init();
}
return instance;
}
} })(); // 测试
const singleA = mySingleton.getInstance();
const singleB = mySingleton.getInstance();
console.log( singleA.getRandomNumber() === singleB.getRandomNumber()); // true
console.log(singleA.publicMethod()) // I am public

下面写一个我们在场景中经常使用的一种简单的非标准的单例模式类型,

场景一:使用简单的单例模式实现一个可编辑表格

html

   <table class="table table-bordered" id="js-table-test">
<tr>
<td>编号</td>
<td>姓名</td>
</tr>
<tr>
<td>1</td>
<td>okaychen</td>
</tr>
<tr>
<td>2</td>
<td>StackOverflowChen</td>
</tr>
</table>

没使用单例模式之前,我们可能会这样处理:

   $("#js-table-test td").click(function (argument) {
var m = $(this).html();
var s = "<input type='text' value='" + m + "' />";
$(this).html(s);
})
$("#js-table-test td").on('keyup','input',function(e){
e.stopPropagation();
var me = $(this);
if(e.keyCode==13){
me.val();
}
})

那么就让我们对比一下使用单例的代码 思路>>

1、使用自执行函数传递参数$,减少查询次数

2、使用简单的单例模式,为之后修改或者模块化打基础

提供单一访问点init通过datas共享数据,render封装对应的元素,bind来绑定事件,_do来规范私有事件;

  (function ($) {
// 命名空间
var index = {
init: function () {
// 入口
var me = this;
me.render();
me.bind();
},
datas: {
// 共享数据
num: 1
},
render: function () {
// 封装对应的元素
var me = this;
me.test = $('#js-table-test td');
},
bind: function () {
// 绑定事件
var me = this;
me.test.on('click', $.proxy(me['_do'], this));
},
_do: function (e) {
// 私有事件
var me = this;
var m = $(e.target).text();
var s = "<input type='text' value='" + m + "' />";
$(e.target).html(s);
console.log(me.datas.num ++)
}
}
index.init();
})(jQuery);

「设计模式」JavaScript - 设计模式之单例模式与场景实践的更多相关文章

  1. 「译」JavaScript 的怪癖 1:隐式类型转换

    原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 ...

  2. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

  3. 【设计模式】Javascript设计模式——状态模式(行为型)

    注:这个模式是非常聪明的,很有点数学中组合的意思,现在,来看下这个模式是怎么个思想. 问题提出:假如某个操作有三种可能,分别为1,2,3,还可能是组合,比如先执行1,再执行2或者先执行2再执行3或者1 ...

  4. 「前端」尚妆 UI 组件库工程实践(weex vue)

    本文来自尚妆前端团队南洋 发表于尚妆github博客,欢迎订阅! 前言 尚妆大前端团队使用 weex 进行三端统一开发有一段时间了,截止本文发表「达人店」APP大部分页面都已经用 weex 进行了重构 ...

  5. JavaScript设计模式-单例模式、模块模式(转载 学习中。。。。)

    (转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ...

  6. JavaScript设计模式与开发实践 - 单例模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...

  7. 探索Javascript设计模式---单例模式

    最近打算系统的学习javascript设计模式,以便自己在开发中遇到问题可以按照设计模式提供的思路进行封装,这样可以提高开发效率并且可以预先规避很多未知的问题. 先从最基本的单例模式开始. 什么是单例 ...

  8. JavaScript设计模式_01_单例模式

    最近项目不太忙,难得有时间看看书,平时挺喜欢js这门语言.也看过很多高级教程,觉得自己还是比较热衷于js的设计模式.这一次重温一下<JavaScript设计模式与开发实践>,开篇为单例模式 ...

  9. 再起航,我的学习笔记之JavaScript设计模式10(单例模式)

    单例模式 单例模式(Singleton) : 又被称为单体模式,是只允许实例化一次的对象类.一个类有且仅有一个实例,并且自行实例化向整个系统提供. 命名空间 单例模式可能是JavaScript中我们最 ...

随机推荐

  1. Hive内置数据类型

    Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型.其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBL ...

  2. VacmMIB

    VACM 基于视图的访问控制模型  是SNMPV3对MIB中被管对象的访问进行控制的模型 特点: 1.VACM 确定是否允许用户访问本地MIB的被管理对象.当用户请求消息到达代理的命令响应器时,命令响 ...

  3. php中常用的字符串长度函数strlen()与mb_strlen()实例解释

    int strlen ( string $string )  int strlen ( string $string )  获取给定字符串的[字节]长度 成功则返回字符串$string的长度,如果$s ...

  4. html基础知识笔记

    HTML基础 1.1HTML文件的基本结构和W3C标准 1.1.1HTML简介 HTML是一种描述网页的语言,一种超文本标记的语言! 1.1.2HTML文件的基本结构 头部(head) 头部是网页的标 ...

  5. java中需要注意的小细节

    很早以前就打算写博客,但是总是因为不知道写什么,或是觉得博客里其他人已经把我要写的整理很好了而迟迟没有动笔,现在决定把自己平时的记录的一些笔记拿出来,希望大神们可以批评指导,并且希望能够帮助一些刚刚入 ...

  6. Linux下搭建tomcat和jre的环境

    1.下载linux版本的tomcat和jre tomcat下载:http://pan.baidu.com/s/1nt7D87J: jre下载:http://pan.baidu.com/s/1sj4hA ...

  7. Android签名机制---签名过程

    大神文章:http://blog.csdn.net/jiangwei0910410003/article/details/50402000 一.知识点 1.数据摘要(数据指纹).签名文件,证书文件 2 ...

  8. SpringMVC中redirect跳转后如何保存Model中的数据?

    @RequestMapping(value = "delete-user", method = RequestMethod.POST) public String deleteUs ...

  9. Quartz.NET实现作业调度

    一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp ...

  10. 简单的CSS颜色查看工具

    可以通过输入ARGB(A代表透明度)格式或者HEX格式查看颜色,也可以进行ARGB格式和者HEX格式转换,如下图 使用C#编写,我已将源代码压缩上传 下载地址:http://files.cnblogs ...