什么是单例模式?

单例模式是指,类多次实例化返回的对象是同一个。

反例

var tt = function(name){
this.name = name;
}; var t1 = new tt('t1');
var t2 = new tt('t2'); console.log('t1和t2',t1 === t2);
// => t1和t2 false

上面的代码,t1和t2就不是同一个对象。

同样的实例化方法,我们怎么让t1和t2是同一个对象?

手动创建单例函数

请看如下代码。

var tt = function(name){
this.name = name;
}; var ttSingleHandle = (function () {
var instance;
var singleFn = function(name){
if (!instance) {
instance = new tt(name);
}
return instance;
}
singleFn.prototype.construtor = tt;
return singleFn;
})(); var t1 = new tt('t1');
var t2 = new tt('t2'); var t5 = new ttSingleHandle('t5');
var t6 = new ttSingleHandle('t6'); console.log('t1和t2',t1 === t2);
console.log('t5和t6',t5 === t6);
// => t1和t2 false
// => t5和t6 true

这里t5和t6是同一个对象。

然而每次手动创建对应的单例函数效率不高,我们可以改造成单例工程函数。

单例工厂函数

var tt = function(name){
this.name = name;
}; var singleFactory = function (fn) {
var instance;
var singleFn = function () {
if(instance !== undefined){
return instance;
}
else{
var temp = fn.bind(this, ...arguments);
instance = new temp();
return instance;
}
};
singleFn.prototype.construtor = fn;
return singleFn;
}; var t1 = new tt('t1');
var t2 = new tt('t2'); var ttSingle = singleFactory(tt);
var t3 = new ttSingle('t3');
var t4 = new ttSingle('t4'); console.log('t1和t2',t1 === t2);
console.log('t3和t4',t3 === t4);
// => t1和t2 false
// => t3和t4 true

ES6的单例模式

class Singleton {
constructor(name) {
this.name = name;
this.instance = null;
}
static getInstance(name) {
if(!this.instance) {
this.instance = new Singleton(name);
}
return this.instance;
}
} var s1 = Singleton.getInstance('s1');
var s2 = Singleton.getInstance('s2');
console.log(s1 === s2);
// => true

因为截止2018年6月22日,ES6类不支持静态属性,只支持静态函数。

静态属性的支持还在ES7提案中。

假设支持静态属性,那么写法如下。

class Singleton {
static instance = null constructor(name) {
if (!Singleton.instance) {
this.name = name;
instance = this;
}
return Singleton.instance;
}
} var s1 = new Singleton('s1');
var s2 = new Singleton('s2');
console.log(s1 === s2);
// => true

JavaScript形而上的单例模式的更多相关文章

  1. JavaScript中的单例模式

    单例模式 在JavaScript中,单例(Singleton)模式是最基本又最有用的模式之一.这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的变量进行访问.确保单例 ...

  2. JavaScript设计模式之单例模式【惰性单例】

    在提高开发水平,往中高级前端工程师中,利用设计模式是必不可少的一条道路.掌握设计模式的思想远远比硬套重要,因为设计模式是一种思想,不局限于开发语言.但实际上由于语言的特性不同,往往在实现的时候会有不少 ...

  3. JavaScript设计模式,单例模式!

    单例设计模式:保证一个类仅有一个实例,并且提供一个访问它的全局访问点.有些对象只需要一个,这时可用单例模式. 传统的单例模式 和new 创建对象的调用不一样 调用者要调用xxx.getInstance ...

  4. 第一章 --- 关于Javascript 设计模式 之 单例模式

    首先我们对单例模式先进行理论上的讲解,接下来,我们再通过具体的代码示例,来讲解,这个单例模式的使用场景和这种模式的优缺点 (这个系列的所有关于设计模式的都是面向Javascript) 一.理论定义: ...

  5. javascript 模式(2)——单例模式

    单例模式是一种非常极端的模式,它保证了一个类在整个应用程序域中只有一个实体,意味着当你多次创建某一个类的实例的时候它们都是第一次创建的那个. 在Java或c#环境实现单例模式很简单,只需要定义静态变量 ...

  6. JavaScript设计模式之单例模式

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

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

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

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

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

  9. 「设计模式」JavaScript - 设计模式之单例模式与场景实践

    单例介绍 上次总结了设计模式中的module模式,可能没有真真正正的使用在场景中,发现效果并不好,想要使用起来却不那么得心应手, 所以这次我打算换一种方式~~从简单的场景中来看单例模式, 因为Java ...

随机推荐

  1. nodejs(二)浏览器与服务器连接初探

  2. Spark SQL 之 Join 实现

    原文地址:Spark SQL 之 Join 实现 Spark SQL 之 Join 实现 涂小刚 2017-07-19 217标签: spark , 数据库 Join作为SQL中一个重要语法特性,几乎 ...

  3. 剑指offer——python【第43题】左旋转字符串

    题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...

  4. 根据Excel模板,填写报表,并下载到web浏览器端

    package com.neusoft.nda.basic.recordmanager.viewelec.servlet; import java.io.File; import java.io.Fi ...

  5. python语法_字符类型

    str(string): 字符串   str(被转换的数据) int(interger):整数   int(被转换的数据)

  6. 【Linux内存源码分析】vmalloc不连续内存管理(转)

    https://www.jeanleo.com/2018/09/09/%E3%80%90linux%E5%86%85%E5%AD%98%E6%BA%90%E7%A0%81%E5%88%86%E6%9E ...

  7. [转载] apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))

    遇见相同的问题. https://www.cnblogs.com/felixzh/p/8295471.html -------------------------------------------- ...

  8. 网络对抗实验一 逆向及Bof基础实践

    网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  9. SparkContext初始化之SparkScheduler初始化

  10. 极验验证使用-滑动&选字验证码

    准备 SDK下载 首先在极验官网下载好SDK,附上官网链接,点此可直接下载python版zip包. 模块安装 使用该SDK时发现它依赖两个模块,分别是geetest和requests. pip ins ...