优雅而高效的JavaScript—— Class 和模块化

在这里插入图片描述
😊博主:小猫娃来啦
😊文章核心:优雅而高效的JavaScript—— Class 和模块化

文章目录

  • 引言
  • Class 的概念和用法
    • Class 的定义
    • Class 的继承
    • Class 的静态方法和属性
  • 模块化的概念和用法
    • 模块的导出和导入
    • 模块的默认导出和命名导出
    • 模块的循环依赖问题
  • Class 和模块化的结合应用
    • 使用 Class 和模块化实现一个简单的计算器
    • 使用 Class 和模块化实现一个简单的购物车
  • 总结

引言

在过去,JavaScript 是一门基于原型的面向对象编程语言,没有 Class 和模块化的概念。这导致了代码的组织结构混乱,难以维护和扩展。ES6 引入了 Class 和模块化的概念,使得 JavaScript 可以更加面向对象,具备模块化的组织结构。本文将介绍 Class 和模块化的概念和用法,并通过示例代码演示其应用。


Class 的概念和用法

Class 的定义

Class 是一种用于创建对象的模板或蓝图。通过 Class,我们可以定义对象的属性和方法,并通过实例化来创建具体的对象。

示例代码:

class Person {constructor(name, age) {this.name = name;this.age = age;}sayHello() {console.log(`Hello, my name is ${this.name}.`);}
}const person = new Person("John", 25);
person.sayHello(); // 输出:Hello, my name is John.

在上面的示例中,我们定义了一个名为 Person 的 Class,它有两个属性 name 和 age,以及一个方法 sayHello。通过 new 关键字可以创建 Person 的实例,并调用其方法。

Class 的继承

Class 支持继承,子类可以继承父类的属性和方法,并可以重写或扩展它们。

示例代码:

class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a sound.`);}
}class Dog extends Animal {speak() {console.log(`${this.name} barks.`);}
}const dog = new Dog("Bobby");
dog.speak(); // 输出:Bobby barks.

在上面的示例中,我们定义了一个 Animal 的父类和一个 Dog 的子类。子类 Dog 继承了父类 Animal 的属性和方法,并重写了 speak 方法。通过创建 Dog 的实例,我们可以调用子类的方法。

Class 的静态方法和属性

Class 还支持静态方法和属性,它们可以直接通过类名调用,而不需要创建实例。

示例代码:

class MathUtils {static add(a, b) {return a + b;}static PI = 3.14159;
}console.log(MathUtils.add(1, 2)); // 输出:3
console.log(MathUtils.PI); // 输出:3.14159

在上面的示例中,我们定义了一个 MathUtils 的类,它有一个静态方法 add 和一个静态属性 PI。我们可以直接通过类名调用这些静态方法和属性,而不需要创建实例。


模块化的概念和用法

模块的导出和导入

模块化是一种将代码分割成独立的模块,并通过导出和导入来共享和使用这些模块的方式。ES6 引入了模块化的语法,使得 JavaScript 可以更好地组织和管理代码。

示例代码:
在一个名为 utils.js 的模块中,我们导出了两个函数 add 和 subtract:

export function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}

在另一个文件中,我们通过 import 关键字导入这些函数,并使用它们:

import { add, subtract } from './utils.js';console.log(add(1, 2)); // 输出:3
console.log(subtract(3, 2)); // 输出:1

在上面的示例中,我们将 add 和 subtract 函数导出为 utils.js 模块的一部分,并通过 import 关键字在另一个文件中导入并使用它们。

模块的默认导出和命名导出

除了导出多个函数或变量,我们还可以通过默认导出来导出一个默认的函数或变量。

示例代码:
在一个名为 utils.js 的模块中,我们默认导出了一个函数 multiply:

export default function multiply(a, b) {return a * b;
}

在另一个文件中,我们通过 import 关键字导入默认导出的函数,并使用它:

import multiply from './utils.js';console.log(multiply(2, 3)); // 输出:6

在上面的示例中,我们将 multiply 函数默认导出为 utils.js 模块的一部分,并通过 import 关键字在另一个文件中导入并使用它。

模块的循环依赖问题

在模块化的代码中,循环依赖是一个常见的问题。循环依赖指的是两个或多个模块之间相互依赖,形成了一个循环的依赖关系。

示例代码:
在一个名为 moduleA.js 的模块中,我们导入了 moduleB.js 模块,并使用其中的函数:

import { foo } from './moduleB.js';export function bar() {console.log(foo());
}

在另一个文件 moduleB.js 中,我们导入了 moduleA.js 模块,并使用其中的函数:

import { bar } from './moduleA.js';export function foo() {return 'Hello from moduleB.js';
}bar();

在上面的示例中,moduleA.js 导入了 moduleB.js 的 foo 函数,而 moduleB.js 导入了 moduleA.js 的 bar 函数。这样就形成了一个循环的依赖关系,导致代码无法正确执行。

为了解决循环依赖的问题,我们可以将依赖关系改为单向的,或者使用其他的解决方案,如在模块的顶部导入。


Class 和模块化的结合应用

使用 Class 和模块化实现一个简单的计算器

// calculator.js
export class Calculator {add(a, b) {return a + b;}subtract(a, b) {return a - b;}
}// main.js
import } from './calculator.js';const calculator = new Calculator();
console.log(calculator.add(1, 2)); // 输出:3
console.log(calculator.subtract(3, 2)); // 输出:1

在上面的示例中,我们定义了一个 Calculator 的 Class,并导出它。在另一个文件中,我们通过导入 Calculator,并创建它的实例,来使用其中的方法。

使用 Class 和模块化实现一个简单的购物车

// product.js
export class Product {constructor(name, price) {this.name = name;this.price = price;}
}// cart.js
export class Cart {constructor() {this.products = [];}addProduct(product) {this.products.push(product);}getTotalPrice() {return this.products.reduce((total, product) => total + product.price, 0);}
}// main.js
import { Product } from './product.js';
import { Cart } from './cart.js';const cart = new Cart();
const product1 = new Product("Apple", 1);
const product2 = new Product("Banana", 2);cart.addProduct(product1);
cart.addProduct(product2);console.log(cart.getTotalPrice()); // 输出:3

在上面的示例中,我们定义了一个 Product 的 Class 和一个 Cart 的 Class,并导出它们。在另一个文件中,我们通过导入 Product 和 Cart,并创建它们的实例,来实现一个简单的购物车功能。


总结

ES6 引入了 Class 和模块化的概念,使得 JavaScript 可以更加面向对象,具备模块化的组织结构。Class 允许我们使用面向对象的方式来定义和实例化对象,而模块化则提供了一种组织和管理代码的方式。通过 Class 和模块化,我们可以更好地组织和管理代码,提高代码的可维护性和可扩展性。在实际开发中,我们可以使用 Class 和模块化来实现各种功能,如计算器、购物车等。

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABB变频器使用PROFINET IO通信模块时的激活方法

ABB变频器使用PROFINET IO通信模块时的激活方法 ABB传动通讯总线适配器的激活(ACS380): 首先,如下图所示,要采购并安装PROFINET IO总线通信模块(我这里支持3种通信协议,大家在实际使用时,用到哪种就购买哪种即可), 如下图所示,进入参数设置, 如下图所示,进入“完…

实现一个todoList可直接操作数据(上移、下移、置顶、置底)

演示 HTML部分 <!DOCTYPE html> <html> <head><title>表格示例</title> </head> <body><table border"1"><thead><tr><th>更新时间</th><th>操作</th></tr></thead&…

从恐怖到商机:2023万圣节跨境电商如何打造鬼魅消费体验?

又到了一年一度的糖果、恐怖装扮和万圣节派对的时候&#xff01;随着10月底的日子临近&#xff0c;人们开始为庆祝万圣节做各种各样的准备。而对于跨境电商来说&#xff0c;这个节日也是一个独特的商机&#xff0c;能够在全球市场上推广各种各样的节日相关商品。Adobe Digital …

Jupyter Notebook的使用

以管理员身份运行 命令行显示内容含义 JupyterLab application directory is D:\Program Files\anaconda\share\jupyter\lab↑这一行是JupyterLab的地址 Serving notebooks from local directory: C:\Users\Sylvia\Documents↑这一行是文件的保存地址。其中Users中文文件夹名是…

【C语言】——通讯录(静态-动态增长-文件储存)

目录 前言&#xff1a; 一&#xff1a;整体框架 关于通讯录结构体的创建 二&#xff1a;通讯录的功能实现&#xff08;静态&#xff09; 2.1初始化通讯录 2.2增加联系人 2.3打印通讯录 2.4删除联系人 2.5 查找联系人 2.6修改联系人 2.7排序联系人 三&#xff1a;通…

14.10 Socket 套接字选择通信

对于网络通信中的服务端来说&#xff0c;显然不可能是一对一的&#xff0c;我们所希望的是服务端启用一份则可以选择性的与特定一个客户端通信&#xff0c;而当不需要与客户端通信时&#xff0c;则只需要将该套接字挂到链表中存储并等待后续操作&#xff0c;套接字服务端通过多…

Spring Boot 3.0 已经就绪,您准备好了么?

Java 微服务开发框架王者 Spring 2014 年的 4 月&#xff0c;Spring Boot 1.0.0 正式发布。距离 1.0 版本的发布已经过去了 9 年多的时间&#xff0c;如今 Spring Boot 已经被 Java 开发者广泛使用&#xff0c;正如 JRebel 的 2022 年开发者生产力报告中提到的那样&#xff0c…

pdf压缩文件怎么压缩最小?

pdf压缩文件怎么压缩最小&#xff1f;我们很多项目介绍或是学术的报告都是采用的这个pdf格式&#xff0c;那么我们在存储或是需要进行分享的时候&#xff0c;可能就会因为文件过大而导致无法打开或是发送了。那么就需要将其进行压缩。PDF文件压缩方法很多&#xff0c;pdf压缩文…

基于安卓Android的掌上酒店预订APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把掌上酒店预订与现在网络相结合&#xff0c;利用java技术建设掌上酒店预订APP&#xff0c;实现掌上酒店预订的信息化。则对于进一步提高掌上酒店预订发展&#xff0c;丰富掌上酒店预订经验能起到不少的促进作用。 掌上酒…

Netty 入门 — 要想掌握 Netty,你必须知道它的这些核心组件

在上篇文章&#xff08;Netty 入门 — 亘古不变的Hello World&#xff09;中&#xff0c;我们简单认识了开发一个 Netty 服务端和客户端代码的主要步骤了&#xff0c;在这几大步骤中我们基本上可以看出 Netty 的几个核心组件。 在真正进入 Netty 的学习之前&#xff0c;我们非…

docker-compose安装

如果提示docker-compose未找到命令&#xff0c;需要安装一下 curl -L https://github.com/docker/compose/releases/download/1.23.0-rc2/run.sh > /usr/local/bin/docker-compose 修改权限 chmod x /usr/local/bin/docker-compose 建立软连接 ln -s /usr/local/bin/do…

如何利用BIGEMAP软件查看历史影像

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 很多人都在寻找历史影像图&#xff0c;这块的需求是非常大&#xff0c;历史影像一般可以用于历史地貌的变迁分析&#xff0c;还原以前的生态场景&#xff0c;对范围面积…