什么是单例模式?

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

反例

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. CString数组和CStringArray

    CStringArray是编译器定义的类型!可以进行一些(如:访问.增.删.改)等操作. 集中单个字符串的操作使用Cstring,集中一批字符串的管理使用CstringArray. 一个是动态,CSt ...

  2. ifcfg命令

    ifcfg命令是一个bash脚本程序,用来设置Linux中的网络接口参数. 语法 ifcfg(参数) 参数 网络接口:指定要操作的网络接口: add/del:添加或删除网络接口上的地址: ip地址:指 ...

  3. windows系统dos下查看无线网密码

    (1)采用命令:netsh wlan show profiles 查看电脑连接过的无线网: (2)采用命令:netsh wlan show profile name ="wifi 名字&qu ...

  4. 【ArcGIS for Server】制作并发布GP服务--缓冲分析为例

    https://www.cnblogs.com/d2ee/p/3641279.html https://www.jianshu.com/p/5331fa708fe5 https://www.cnblo ...

  5. Mac系统显示隐藏文件及文件夹

    显示隐藏文件 终端 输入如下命令,回车即可: defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Fin ...

  6. Django中使用Celery

    一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...

  7. Spring Jdbc 框架整合的第一天

    Spring  Jdbc的概述 它是Spring框架的持久层子框架.用于对数据库的操作 什么是数据库的操作? 答:对数据库的增删改查 在使用Spring  Jdbc框架,要用到一个类---->J ...

  8. java之Spring集成CXF简单调用

    简介 Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.CXF 继承了 Celtix 和 X ...

  9. [js]js设计模式-修改原型

    参考 操作原型 - 给原型添加属性 - 方法1: Fn.prototype.sum=function{} - 方法2: Fn.prototype={} //constructor指向了Object的原 ...

  10. std::bind学习

    std::bind bind是对C++98标准中函数适配器bind1st/bind2nd的泛化和增强,可以适配任意的可调用对象,包括函数指针.函数引用.成员函数指针和函数对象. bind接受的第一个参 ...