JavaScript中的设计模式之一--单例模式和模块
虽然有一种疯狂天才的感觉可能很诱人,但重新发明轮子通常不是设计软件的最佳方法。很有可能有人已经遇到了和你一样的问题,并以一种聪明的方式解决了它。这样的最佳实践在形式化后被称为设计模式。今天我们来看看它们的概念,并检查单例模式和模块。
什么是设计模式
我们可以将设计模式视为许多开发人员在各种现实生活场景中测试过的经过验证的解决方案。它们旨在支持软件设计师以可读和可预测的方式解决常见问题。如果我们的应用程序基于经过验证的模式,我们就不用太担心整体结构,因为它们倾向于鼓励我们以一种有组织的方式编写代码。
查看包含某种设计模式的现有代码库可能比尝试理解一种不熟悉的方法更容易。他们也是其他开发者和我们之间的桥梁。使用众所周知的策略可以使沟通更快更容易。
设计模式并不是精确的解决方案。他们为我们提供了一个方案,我们可以根据自己的需要进行调整。这些模式没有绑定到特定的问题,这使得它们非常可重用。它们与特定的编程语言无关,但JavaScript拥有比其他语言更流行的设计模式。
你可能已经使用了其中的一些。常见的JavaScript解决方案往往具有在实现时感觉足够的设计模式。React经常合并高阶组件模式和flux架构。在实现观察者设计模式时,Angular应用程序似乎运行得很好。
单例模式
我们从一个叫做单例的设计模式开始。它是最著名的模式之一,因此是一个很好的起点。其核心是限制一个类只能有一个实例,并确保它是全局可访问的。当你需要管理整个应用程序中的某些内容时,它可能会派上用场。
单例这个术语来自数学,意思是一个集合恰好有一个元素。
按照设计,单例会在类还不存在时创建一个实例。否则,它们返回对现有实例的引用。
class Singleton {static instance;constructor() {// your logic here}static getInstance() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = new Singleton();return Singleton.instance;}
}
现在,每次调用Singleton.getInstance(),我们都会得到相同的对象。
Singleton.getInstance() === Singleton.getInstance(); // true
上面的代码乍一看没什么问题,但它有一些问题。没有什么可以限制我们直接调用单例构造函数。这时TypeScript可能就派上用场了。
class Singleton {private static instance?: Singleton;private constructor() {// your logic here}static getInstance() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = new Singleton();return Singleton.instance;}
}
通过将单例构造函数变为私有,我们只能在getInstance函数中调用它。
另一种方法是直接从构造函数中返回一个实例。
class Singleton {static instance;constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;// your logic here}
}
new Singleton() === new Singleton() // true
上面的代码让它变得不那么透明,因为有人可能不知道构造函数每次都返回相同的对象。
单例与全局变量有很多共同之处。这也是为什么它们通常不被鼓励的原因,因为它们共享了它们的缺点,因为它可能会使您的应用程序的可读性更差。无论我们认为单例是好是坏,它们都是基本的设计模式之一。了解它们也许有一天会派上用场。即使您不决定自己编写它们,您也可能在某些应用程序中遇到它们。
模块模式
JavaScript应用程序中的另一种典型模式是模块设计模式。将我们的应用程序代码分成模块,对于保持我们的代码库整洁组织起着重要的作用。
不久前,一种流行的方法是将一段代码包含在立即调用的函数表达式(IIFE)中。这是因为所有JavaScript文件共享相同的作用域。
index.html
<!DOCTYPE html>
<html lang="en"><head><title>Hello world!</title><script src="hello.js"></script><script src="main.js"></script></head><body></body>
</html>
hello.js
function hello() {console.log('Hello world!');
}
hello(); // Hello world!
main.js
hello(); // Hello world!
在一个文件中定义某些内容会污染整个全局范围,这不是一种理想的情况。解决这个问题的一个常见方法是通过创建一个函数并立即调用它来引入模块模式。
hello.js
(function(){function hello() {console.log('Hello world!');}hello(); // Hello world!
})();
main.js
hello(); // Uncaught ReferenceError: hello is not defined
上述方法的一个重要的事情是,如果我们在上面的模块内定义任何变量,它在它之外是不可用的。
我们还可以通过从立即调用的函数表达式返回一些东西来导出hello() 函数。
hello.js
const helloModule = (function(){function hello() {console.log('Hello world!');}return {hello}
})();
main.js
helloModule.hello(); // Hello world!
随着JavaScript语言的发展,我们找到了其他方法来处理上述问题。其中之一是ES6模块,其中每个模块都有自己的文件。现代浏览器已经支持它们。
Node.js环境还通过实现一个名为CommonJS的模块系统来提供解决方案。让我们来看看一段奇怪的代码:
console.log('Hello');
return;
console.log('world!');
这看起来很奇怪,因为return语句不能在函数之外发生。当我们导入这样的文件时,Node.js将其包装在一个函数中,如下所示:
function (exports, require, module, __filename, __dirname) {console.log('Hello');return;console.log('world!');
}
多亏了上面的代码,该模块有了自己的作用域,上面的代码可以正常运行。
总结
在本文中,我们了解了什么是设计模式。我们首先要知道的是单例模式和模块模式。上面文章的一个观点是,你可能已经在使用设计模式了。这可能是一个好主意,去学习更多并扩展我们的编程词汇。多亏了这一点,我们才能更快地想出解决问题的办法。此外,它可能会更高效,可读性更强。
相关文章:
JavaScript中的设计模式之一--单例模式和模块
虽然有一种疯狂天才的感觉可能很诱人,但重新发明轮子通常不是设计软件的最佳方法。很有可能有人已经遇到了和你一样的问题,并以一种聪明的方式解决了它。这样的最佳实践在形式化后被称为设计模式。今天我们来看看它们的概念,并检查单例模式和…...
回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现GAM广义加性模型多输入单输出回归预测(多指标,多图)效果一览基本介绍程序设计参考资料 效果一览 基本…...
css学习4(背景)
1、CSS中,颜色值通常以以下方式定义: 十六进制 - 如:"#ff0000"RGB - 如:"rgb(255,0,0)"颜色名称 - 如:"red" 2、background-image 属性描述了元素的背景图像. 默认情况下,背景图像进…...
二、SQL,如何实现表的创建和查询
1、新建表格(在当前数据库中新建一个表格): (1)基础语法: create table [表名]( [字段:列标签] [该列数据类型] comment [字段注释], [字段:列标签] [该列数据类型] comment [字段注释], ……,…...
大数据及软件教学与实验专业实训室建设方案
一 、系统概述 大数据及软件教学与实验大数据及软件教学与实验在现代教育中扮演重要角色,这方面的教学内容涵盖了大数据处理、数据分析、数据可视化和大数据应用等多个方面。以下是大数据及软件教学与实验的一般内容:1. 数据基础知识:教授学生…...
信创办公–基于WPS的EXCEL最佳实践系列 (公式和函数)
信创办公–基于WPS的EXCEL最佳实践系列 (公式和函数) 目录 应用背景相关知识操作步骤1、认识基本的初级函数2、相对引用,绝对引用,混合引用3、统计函数4、文本函数 应用背景 熟练掌握Excel的函数工具能让我们在日常的使用中更加方…...
【Apollo】自动驾驶感知——毫米波雷达
作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖…...
SpringBoot部署到腾讯云
SpringBoot部署到腾讯云 此处默认已经申请到腾讯云服务器,因为本人还没有申请域名,所以就直接使用的ip地址 XShell连接到腾讯云 主机中填写腾讯云的公网ip地址 公网ip地址在下图中找到 接下来填写服务器的用户名与密码 一般centOS用户名为rootÿ…...
Git 设置代理
Git 传输分两种协议,SSH和 http(s),设置代理也需要分两种。 http(s) 代理 Command Line 使用 命令行 模式,可以在Powershell中使用以下命令设置代理: $env:http_proxy"http://127.0.0.1:7890" $env:https_proxy&quo…...
基于Spring Boot的机场VIP客户管理系统的设计与实现(Java+spring boot+MySQL)
获取源码或者论文请私信博主 演示视频: 基于Spring Boot的机场VIP客户管理系统的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java s…...
图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009
首先找到明星数据 可以看到有一个sheet1,是,记录了所有的关系的数据 然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据 然后这个是构建的CQL语句 首先我们先去启动服务 neo4j console 然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节点的属性...
恒运资本:算力概念强势拉升,亚康股份“20cm”涨停,首都在线等大涨
算力概念21日盘中强势拉升,到发稿,亚康股份“20cm”涨停,首都在线、汇金股份涨逾11%,鸿博股份亦涨停,南凌科技涨近9%,科创信息、神州数码、铜牛信息等涨超7%。 音讯面上,8月19日,202…...
Neo4j之union基础
UNION 用于将多个 MATCH 或 RETURN 子句的结果合并为一个结果集。它可以用来合并不同模式的节点和关系,或者将多个查询的结果合并在一起。以下是一些常用的示例和解释: 基本用法: MATCH (p:Person) WHERE p.age > 30 RETURN p.name AS n…...
搭建:基于nginx的上传功能
搭建:基于nginx的上传功能 文章目录 搭建:基于nginx的上传功能一、准备二、安装nginx1.1 解压nginx和nginx插件1.2 编译并安装nginx 三、启动一个python后台服务,用于上传到临时路径文件,转移到正式路径四、添加nginx配置…...
JavaScript高级
1、JavaScript面向对象 1.1、面向对象介绍 在 Java 中我们学习过面向对象,核心思想是万物皆对象。在 JavaScript 中同样也有面向对象。思想类似。 1.2、类的定义和使用 结构说明 代码实现 <!DOCTYPE html> <html lang"en"> <head>…...
隔断让你的办公室变得更加智能、环保、人性化
隔断可以在办公室中起到多种重要作用,使办公室更加智能、环保和人性化。以下是一些可能的方式: 1. 智能办公室控制系统:可以通过隔断集成智能办公室控制系统,实现办公室照明、温度和空调等设备的自动调节,提高能效和舒…...
web文件上传
文件上传指的是,将本地的图片、视频、音频上传到服务器,提供给其他用户浏览和下载的过程 前端需求 想要进行文件上传对于web前端来说有三个重要要素 1.<input type"file" name"image"> 提供这样的file文件上传格式 2. metho…...
二刷LeetCode--48. 旋转图像(C++版本),数学题
思路:主要是观察变化之后的数组和最开始的数组的区别,不难发现,先转置在左右镜像对称即可。需要注意的是转置和镜像对称中for变量的终止条件。 class Solution { public:void rotate(vector<vector<int>>& matrix) {// 行数…...
神经网络改进:注重空间变化,权重参数调整,正则化, 熵的简单理解
目录 神经网络改进:注重空间变化 将高纬空间映射到地位空间便于表示(供给数据) 将地位空间映射到高纬空间进行分类聚合(达到可分状态(K-means)) 神经网络改进:权重参数调整 自注…...
快速入门vue3新特性和新的状态管理库pinia
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 Vue3.3新特性 defineOptions defineModel pinia 介绍 与 Vuex 3.x/4.x 的比较 安装 核心概念 定义…...
用PDA5927四象限光电管DIY一个激光对中/位置检测模块(附Python数据采集代码)
用PDA5927四象限光电管DIY激光对中检测模块实战指南 在工业自动化和精密仪器领域,激光对中检测一直是个既基础又关键的技术需求。传统方案往往依赖昂贵的专业设备,而今天我们要用一颗不到百元的PDA5927四象限光电管,配合常见运放和Python代码…...
Mysql插入数据时,怎么让自增的主键续接表当前最大ID+1
一.需求如下在user表中,需要插入数据, 该数据的主键ID值为当前表最大ID1, 比如: 当前表最大ID977, 当插入数据: insert into(date, name) values(2026-04-28, 张三), (2026-04-28, 李四)时,主键ID应该为978,979这样, 但现在进行插入时, 主键ID变化却是如下:二.原因造成上面情况…...
React Native Voice多语言支持深度解析:如何实现全球化语音识别应用
React Native Voice多语言支持深度解析:如何实现全球化语音识别应用 【免费下载链接】voice :microphone: React Native Voice Recognition library for iOS and Android (Online and Offline Support) 项目地址: https://gitcode.com/gh_mirrors/voi/voice …...
Magnet2Torrent终极指南:将磁力链接永久保存为种子文件的简单方法
Magnet2Torrent终极指南:将磁力链接永久保存为种子文件的简单方法 【免费下载链接】Magnet2Torrent This will convert a magnet link into a .torrent file 项目地址: https://gitcode.com/gh_mirrors/ma/Magnet2Torrent 还在为磁力链接失效而烦恼吗&#x…...
观察 Taotoken 账单详情追溯各项目 API 调用明细
观察 Taotoken 账单详情追溯各项目 API 调用明细 1. 账单概览与访问入口 Taotoken 控制台提供了完整的账单记录功能,用户可以在「账单」页面查看所有历史消费记录。该页面默认展示最近 30 天的消费趋势图表,下方列出按日汇总的消费金额。点击任意日期或…...
如果你使用的是像 Vite、Create React App 等现代构建工具,通常可以通过 npm run dev 或 yarn dev 命令启动开发服务器。
在 VS Code 中运行前端代码主要有几种方式,具体取决于你开发的项目类型和需求。以下是几种常用方法:使用 Live Server 插件(推荐用于静态网页):这是最简单快捷的方式,尤其适合开发静态 HTML、CSS 和 Java…...
医疗DevSecOps终极防线(Docker 27合规认证黄金三角模型):eBPF运行时鉴权 + OCI Artifact签名 + 医疗专用CVE-2024补丁基线
更多请点击: https://intelliparadigm.com 第一章:医疗DevSecOps终极防线与Docker 27合规认证黄金三角模型概览 在医疗信息化高速演进的当下,DevSecOps不再仅是效率工具,而是贯穿等保2.0、GDPR、HIPAA及中国《医疗器械软件注册审…...
初创公司如何借助 Taotoken 统一 API 快速原型验证多个大模型能力
初创公司如何借助 Taotoken 统一 API 快速原型验证多个大模型能力 1. 统一接入降低技术门槛 对于资源有限的初创团队而言,直接对接多个大模型厂商的 API 存在显著的技术与管理成本。不同厂商的接口规范、认证方式和返回格式各异,团队需要为每个供应商编…...
终极FanControl风扇控制指南:免费解决Windows电脑散热与噪音难题
终极FanControl风扇控制指南:免费解决Windows电脑散热与噪音难题 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_T…...
从“黑盒”到“白盒”:给Keil FLM文件做一次“体检”,排查下载失败难题
从“黑盒”到“白盒”:给Keil FLM文件做一次“体检”,排查下载失败难题 当你熬夜调试嵌入式系统,Keil突然弹出"Flash Download failed"的红色警告,那种感觉就像在马拉松终点线前被绊倒。FLM文件作为Keil与Flash芯片之间…...
