[JS设计模式] Module Pattern

news2025/1/20 10:50:32

随着应用程序和代码库的增长,保持代码的可维护性和模块化变得越来越重要。模块模式允许将代码分成更小的、可重用的部分。

除了能够将代码分割成更小的可重用部分之外,模块还允许将文件中的某些值保留为私有。默认情况下,模块内的声明范围(封装)为该模块。如果我们不显式导出某个值,那么该值在该模块之外不可用。这降低了在代码库的其他部分声明的命名冲突的风险,因为这些值在全局作用域中不可用。

ES2015引入了内置的JavaScript模块。模块是一个包含JavaScript代码的文件,与普通脚本相比在行为上有一些不同。

让我们看一个名为math.js的模块示例,其中包含数学函数。

// math.js
function add(x, y) {
  return x + y;
}
function multiply(x) {
  return x * 2;
}
function subtract(x, y) {
  return x - y;
}
function square(x) {
  return x * x;
}
// index.js
console.log(add(2, 3));
console.log(multiply(2));
console.log(subtract(2, 3));
console.log(square(2));

math.js 中定义了四个函数add,multiply,subtrack,square,我们想要在index.js中调用这几个函数。直接运行的话,会报错:Uncaught ReferenceError ReferenceError: add is not defined

请添加图片描述

为了使index.js能调用到math.js中的函数,则需要先将这几个函数导出。使用关键词export将函数导出。

// math.js
export function add(x, y) {
  return x + y;
}
export function multiply(x) {
  return x * 2;
}
export function subtract(x, y) {
  return x - y;
}
export function square(x) {
  return x * x;
}

仅仅将math.js中的函数export还不够,还需要在index.js中,将需要调用的函数导入。

// index.js
import { add, multiply, subtract, square } from "./math.js";

接下来,我们在运行一下,看看效果:

请添加图片描述

直接运行报错了。在node.js环境下,按上述简单的代码构成是不够的。

解决方案

1. npm init -y
2. 在package.json中添加"type": "module",

我的代码结构如下:

请添加图片描述

再次运行,结果如下:

请添加图片描述

可以看到,math.js中的4个显示声明的函数可以导出,index.js中也能正常导入这四个函数,并正常调用。

接下来,我们尝试下,如果在math.js中的变量不声明为export,看index.js是否还可以调用。

请添加图片描述

显然和我们预想的一致,不会奏效。

通过将值保留为模块私有,可以降低意外污染全局作用域的风险。不必担心模块使用者会意外覆盖模块内部的变量的值,这些变量可能与模块的私有变量具有相同的名称:它可以防止命名冲突

如果从模块导出的命名和当前文件的本地命名有冲突,怎么解决呢?

请添加图片描述

可以通过as关键字重命名被导入的函数名。

请添加图片描述

上述代码将addmultipy重命名为addValuesmultiplyValues。消除了命名冲突问题。

除了有我们上述代码中使用的命名导出外,还有默认导出

请添加图片描述

在math.js中将add函数声明为export default,可以在index.js中直接调用。如果默认导出的函数有命名冲突的话,可以直接在index.js中重命名

请添加图片描述

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt编写的exe程序上添加程序信息

1、qtcreator编写 在pro文件中添加如下信息 # 版本信息 VERSION 4.0.2.666# 图标 RC_ICONS Images/MyApp.ico# 公司名称 QMAKE_TARGET_COMPANY "Digia"# 产品名称 QMAKE_TARGET_PRODUCT "Qt Creator"# 文件说明 QMAKE_TARGET_DESCRIPTION "Qt …

Android : 画布的使用 简单应用

示例图: MyView.java: package com.example.demo;import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Vi…

node-red:modbus协议数据格式转换

node-red:MODBUS协议数据格式转换 一、32word无符号转换1.1 写操作1.2 读操作 二、字符串转换2.1 字符串写操作2.2 字符串读操作 三、有符号整数转换3.1 有符号16word转换3.1.1 负数 读 操作3.1.2 负数 写 操作 3.2 有符号32word转换 源码 本文将描述通过node-red采…

2024年【北京市安全员-B证】证考试及北京市安全员-B证模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 2024年【北京市安全员-B证】证考试及北京市安全员-B证模拟考试题库,包含北京市安全员-B证证考试答案和解析及北京市安全员-B证模拟考试题库练习。安全生产模拟考试一点通结合国家北京市安全员-B证考试最新…

本地部署 text-generation-webui

本地部署 text-generation-webui 0. 背景1. text-generation-webui 介绍2. 克隆代码3. 创建虚拟环境4. 安装 pytorch5. 安装 CUDA 运行时库6. 安装依赖库7. 启动 Web UI8. 访问 Web UI9. OpenAI 兼容 API 0. 背景 一直喜欢用 FastChat 本地部署大语言模型,今天试一…

GitOps实践指南:GitOps能为我们带来什么?

Git,作为开发过程中的核心工具,提供了强大的版本控制功能。即便在写代码的时候稍微手抖一下,我们也能通过 Git 的差异对比(diff)轻松追踪到庞大工程中的问题,确保代码的准确与可靠。这种无与伦比的自省能力…

python如何通过日志分析加入黑名单

python通过日志分析加入黑名单 监控nginx日志,若有人攻击,则加入黑名单,操作步骤如下: 1.读取日志文件 2.分隔文件,取出ip 3.将取出的ip放入list,然后判读ip的次数 4.若超过设定的次数,则加…

面向对象(高级)知识点强势总结!!!

文章目录 一、知识点复习1-关键字:static1、知识点2、重点 2-单例模式(或单子模式)1、知识点2、重点 3-理解main()方法1、知识点2、重点 4-类的成员之四:代码块1、知识点2、重点 5-关键字:final1、知识点2、重点 6-关键…

Python 网络编程之搭建简易服务器和客户端

用Python搭建简易的CS架构并通信 文章目录 用Python搭建简易的CS架构并通信前言一、基本结构二、代码编写1.服务器端2.客户端 三、效果展示总结 前言 本文主要是用Python写一个CS架构的东西,包括服务器和客户端。程序运行后在客户端输入消息,服务器端会…

ArcGIS Pro中Conda环境的Scripts文件解读

Scripts中包含的文件如下 1. propy.bat 用于在 ArcGIS Pro 外部运行 Python 脚本(扩展名为 .py 的文件)。使用的conda环境是与ArcGIS pro环境同步。propy.bat原理是代替各自python环境下的python.exe,主要区别是propy.bat使用的是与Pro同的…

YOLOv8算法优化:解决YOLOv8无法打印计算量(GFLOPs)的问题点

💡💡💡本文内容:解决YOLOv8无法打印计算量的问题点 💡💡💡本文提供:1)训练阶段自动打印计算量;2)提供离线打印计算量的代码; 1.计算量介绍 FLOPS:注意S是大写,是 “每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用…

JavaScript 工具库 | PrefixFree给CSS自动添加浏览器前缀

新版的CSS拥有多个新属性,而标准有没有统一,有的浏览器厂商为了吸引更多的开发者和用户,已经加入了最新的CSS属性支持,这其中包含了很多炫酷的功能,但是我们在使用的时候,不得不在属性前面添加这些浏览器的…

nodejs业务分层如何写后端接口

这里展示的是在node express 项目中的操作 ,数据库使用的是MongoDB,前期关于express和MongoDB的文章可访问: Nodejs后端express框架 server后端接口操作:通过路由匹配——>调用对应的 Controller——>进行 Service调用——&…

基于YOLOv8深度学习的45种交通标志智能检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

TCP的三次握手

TCP 是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如 IP 地址、端口号等。 TCP 可以看成是一种字节流,它…

强化学习与推荐系统结合

强化学习与推荐系统结合,是在智能体的学习过程中,会根据外部反馈信息,改变自身状态,在根据自身状态进行决策,就是行动反馈,状态更新,在行动的循环。 深度强化学习推荐系统框架是基于强化学习的…

【数据结构】顺序表与单链表的增删查改

文章目录 前言顺序表增删查改顺序表的定义与初始化增删查改操作测试代码完整代码 单链表的增删查改数据结构定义动态申请节点单链表的尾插和头插单链表的尾删和头删单链表的查找单链表的插入和删除销毁链表测试代码完整代码 总结 前言 在计算机编程领域,数据结构是…

力扣Hot100——柱状图中最大矩形(单调栈)

题目链接:https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envTypestudy-plan-v2&envIdtop-100-liked 经典的单调栈问题 思路:考虑单调递增栈,如果说我拿到的数字比栈顶来的要小,那么说明了我前…

geotool解析shp文件org.locationtech.jts.geom.Polygon报错问题

最近在研究利用geotool制作专题图的功能。geotool加载shp文件和sld样式文件,选然后导出图片,发现点没问题,面总会报: 网上搜到类似问题: GIS:shp文件解析相关_org.locationtech.jts.geom.polygon.getexteriorring(-CS…

搭建APP应用程序如何选择服务器

我经常收到许多关于如何搭建 APP 的询问。其中,如何选择服务器是许多初创企业和开发者经常面临的问题。带着这些问题我也通过一些科技手段收集整理了些知识,今天我就和大家来来探讨如何选择服务器,帮助您搭建一个稳定、高效、安全的 APP。 Ap…