什么是单例模式?

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

反例

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. vue动态组件切换(选项卡)

    vue的动态组件 <template :is='变量'></template> 可以通过改变变量,来改变template的替换内容.达到选项卡的功能 如果想要切换保持不重新创建 ...

  2. python 中字符串的格式化

    # 字符串格式化name = input("name:")age = int(input("age:"))job = input("job:" ...

  3. windows环境下MySQL mysql-5.7.17-winx64 (社区服务版,community server)安装教程

    根据网上查询的资料显示,MySQ在版本5.7开始根目录下没有dada目录,需要额外的“初始化数据库”的操作自动生成data目录. 1.    下载地址: https://cdn.mysql.com// ...

  4. Linux网络 - 数据包的接收过程(转)

    https://segmentfault.com/a/1190000008836467

  5. jsignature 中文开发手册

    2017年5月9日21:23:17,最近比较忙,没时间写博客,真的是越来越懒来了 github:https://github.com/brinley/jSignature http://www.unb ...

  6. LeetCode 521 Longest Uncommon Subsequence I 解题报告

    题目要求 Given a group of two strings, you need to find the longest uncommon subsequence of this group o ...

  7. ES6 数组

    数组创建 Array.of() 将参数中所有值作为元素形成数组. console.log(Array.of(1, 2, 3, 4)); // [1, 2, 3, 4] // 参数值可为不同类型 con ...

  8. websocket作用

    1.即时通讯 web即时通讯(网页的QQ,聊天系统等)可以通过websocket实现. 2.轮询 web开发中,有时需要通过轮询(比如时间间隔5秒)去服务器读取数据. 使用HTTP协议向服务器发送re ...

  9. git操作常见错误处理

    1.Error:The authenticity of host 'github.com (192.30.255.112)' can't be established. Git密钥认证github时出 ...

  10. 文件上传下下载(不包含断点续传) Excel,Word导入导出基础

    1.文件上传下载(MVC应用) 视图:form表单,编码方式为multipart/form-data <body> <div> <form action="/D ...