什么是单例模式?

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

反例

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. day16 十六、包、循环导入、导入模块

    一.包的概念 包:一系列模块的集合体.包通过文件夹管理一系列功能相近的模块 重点:包中一定有一个专门用来管理包中所有模块的文件 包名:存放一系列模块的文件夹的名字 包名(对象)存放的是管理模块的那个文 ...

  2. POJ 1321 - 棋盘问题 - [经典DFS]

    题目链接:http://poj.org/problem?id=1321 Time Limit: 1000MS Memory Limit: 10000K Description 在一个给定形状的棋盘(形 ...

  3. [AI][tensorflow][keras] archlinux下 tersorflow and keras 安装

    tensorflow TensorFlow is an open-source machine learning library for research and production. https: ...

  4. 微信小游戏跳一跳简单手动外挂(基于adb 和 python)

    只有两个python文件,代码很简单. shell.py: #coding:utf-8 import subprocess import math import os def execute_comm ...

  5. Spring中的事务操作

    事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...

  6. 高性能Nginx服务器-反向代理

    Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供 ...

  7. PHP日常模拟业务的小工具

    随机生成姓名 public function getChar($num=2) // $num为生成汉字的数量 { $first = array('赵','钱','孙','李','周','吴','郑', ...

  8. Ethzasl MSF源码阅读(2):百川汇海

    这里有个感觉,就是百川汇海.即IMU数据和相机的消息数据都汇集到msf_core进行处理.接上一篇, 1. 查看IMUHandler_ROS::IMUCallback和IMUHandler_ROS:: ...

  9. kubectl批量删除pvc

    #!/bin/bashkubectl get pvc |grep hub > tmp.txtcat tmp.txt |awk '{split($0,a," ");print ...

  10. https://github.com/tensorflow/models/blob/master/research/slim/datasets/preprocess_imagenet_validation_data.py 改编版

    #!/usr/bin/env python # Copyright 2016 Google Inc. All Rights Reserved. # # Licensed under the Apach ...