[JS设计模式] Module Pattern

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

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

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中重命名

请添加图片描述

请添加图片描述

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sif_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值