JS中的单例模式及单例模式原型类的实现
时间:2021-07-11
本文章向大家介绍JS中的单例模式及单例模式原型类的实现,主要包括JS中的单例模式及单例模式原型类的实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单例模式
单例模式的定义: 保证一个类只有一个实例,并提供一个访问它的全局访问点
通过一个简单的例子来了解单例模式的作用:
class Div {
constructor() {
return document.createElement("div");
}
}
btn.addEventListener("click", function (event) {
const div = new Div();
document.body.appendChild(div);
});
现在页面上的这个按钮每被点击一下就会生成一个div
,但是现在如果这个div是登录框,我当然就会想要这段函数只生成一个,这时候就可以用到单例模式的思想:让一个类只会生成一个实例。
在JS里实现单例模式很简单,只要使用闭包就能做到,这是使用ES6的class语法实现的单例模式:
let div = null;
class Div {
constructor() {
return div ?? (div = document.createElement("div"));
}
}
这样,通过闭包实现了单例模式,无论点击多少次按钮,只会生成一个div。
考虑到单例模式应用的广泛,我实现了一个原型类,通过继承该原型类可以直接得到一个单例模式的类:
const SingletonConstructor = (function () {
const instances = {};
return class {
constructor(Constructor) {
let className = new.target.name;
if (instances[className]) {
return instances[className];
} else {
let instance = new Constructor();
Object.setPrototypeOf.call(null, instance, new.target.prototype);
return (instances[className] = instance);
}
}
};
})();
class Div extends SingletonConstructor {
constructor() {
super(function () {
return document.createElement("div");
});
}
}
需要设计为单例的类只需要继承这个原型类后在构造函数的super
中写入构造函数就能实现单例模式。
原文地址:https://www.cnblogs.com/shaddollxz/p/14999722.html
- 常见的几种Flume日志收集场景实战
- 教你一步搭建Flume分布式日志系统
- 几十条业务线日志系统如何收集处理?
- 0基础搭建Hadoop大数据处理-编程
- 0基础搭建Hadoop大数据处理-集群安装
- Validation of viewstate MAC failed 解决办法
- springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected sin
- springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected sin
- idea启动多个tomcat失败
- Log4Net 生成多个文件、文件名累加解决方法
- 【C#|.NET】lock(this)其实是个坑
- SpringMVC过程中@RequestBody接收Json的问题 总是报415
- 如何开发自己的搜索帝国之安装ik分词器
- 如何开发自己的搜索帝国之ES图形化Kibana安装与使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 案例:强制开库遭遇ORA-16433的处理过程
- 叮~AutoML自动化机器学习入门指南,来了
- 注意:ORACLE 11G ADG RAC 这个情况下并不能高可用
- Nginx转发指向数据库端口并对外开放访问权限
- Python手写了 35 种可解释的特征工程方法
- Geant4--G4ParticleGun定义射线源的发射能谱
- Sony-PMCA-RE, 反向工程索尼PlayMemories相机应用
- 中标麒麟系统Your trial is EXPIRED and no VALID licens
- R初探
- 独家 | 在Python编程面试前需要学会的10个算法(附代码)
- 为什么一个还没毕业的大学生能够把 IO 讲的这么好?
- 如何将单 master 升级为多 master 集群
- 为 Kubernetes 节点发布扩展资源
- Kubernetes 资源预留配置
- PHP一些常见的漏洞梳理