JavaScript 模块和类
第 9 天:JavaScript 模块和类
**日期:2024 年 12 月 16 日**
欢迎来到第 9 天!今天,我们将探索 JavaScript 中的 **模块** 和 **类**,这两个概念可显著增强代码组织、可重用性和可读性。了解这些主题将提升您的 JavaScript 技能,使您能够像专业开发人员一样构建项目。
1. JavaScript 模块
模块可让您将代码拆分成更小、可重复使用的部分。您可以将功能组织到多个文件中,而不是使用一个大文件,从而使您的代码库更易于管理和维护。
为什么要使用模块?
模块中的导出和导入
从模块导出
您可以使用“export”从模块中导出变量、函数或类。
**命名导出**
// utils.js export const add = (a, b) => a + b; export const subtract = (a, b) => a - b;
**默认导出**
// greet.js
export default function greet(name) {
return `Hello, ${name}!`;
}导入模块
使用“import”关键字引入另一个模块的功能。
**示例:导入命名导出**
// main.js
import { add, subtract } from './utils.js';
console.log(add(5, 3)); // Output: 8
console.log(subtract(5, 3)); // Output: 2**示例:导入默认导出**
// main.js
import greet from './greet.js';
console.log(greet("Alice")); // Output: Hello, Alice!动态导入
动态导入在运行时使用“import()”加载模块。
**示例:延迟加载**
const loadModule = async () => {
const module = await import('./utils.js');
console.log(module.add(5, 3)); // Output: 8
};
loadModule();2. JavaScript 类
JavaScript 中的类提供了创建对象和封装相关数据和方法的蓝图。它们是 ES6 的一部分,也是 JavaScript 中面向对象编程的基础。
定义类
使用“class”关键字来定义类。
**示例:基础类**
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
return `Hello, my name is ${this.name} and I am ${this.age} years old.`;
}
}
const person1 = new Person("John", 30);
console.log(person1.greet()); // Output: Hello, my name is John and I am 30 years old.类继承
继承允许一个类使用“extends”关键字从另一个类派生属性和方法。
**示例:继承**
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("Buddy");
dog.speak(); // Output: Buddy barks.静态方法
静态方法属于类本身,而不是实例。
**示例:静态方法**
class MathUtil {
static square(number) {
return number * number;
}
}
console.log(MathUtil.square(4)); // Output: 16私有字段和方法
私有字段和方法只能在类内访问,并以“#”前缀表示。
**示例:私有字段**
class BankAccount {
#balance;
constructor(initialBalance) {
this.#balance = initialBalance;
}
getBalance() {
return this.#balance;
}
}
const account = new BankAccount(1000);
console.log(account.getBalance()); // Output: 1000
// console.log(account.#balance); // Error: Private field '#balance' must be declared in an enclosing class类与对象字面量
虽然对象文字对于简单的数据结构来说快速而直接,但类提供:
3. 组合模块和类
在现代 JavaScript 应用程序中,模块和类可以完美地互补。您可以在一个模块中定义一个类,然后在另一个模块中使用它。
**示例:组合模块和类**
// car.js
export class Car {
constructor(brand, model) {
this.brand = brand;
this.model = model;
}
display() {
return `${this.brand} ${this.model}`;
}
}
// main.js
import { Car } from './car.js';
const myCar = new Car("Tesla", "Model 3");
console.log(myCar.display()); // Output: Tesla Model 34. 真实示例:购物车
这是一个结合模块和类的实际例子。
**文件:cart.js**
export class Cart {
constructor() {
this.items = [];
}
addItem(item) {
this.items.push(item);
}
getTotalItems() {
return this.items.length;
}
}**文件:main.js**
import { Cart } from './cart.js';
const cart = new Cart();
cart.addItem("Apple");
cart.addItem("Banana");
console.log(`Total Items: ${cart.getTotalItems()}`); // Output: Total Items: 2关键要点
练习任务
下一步是什么?
明天,即**第 10 天**,我们将深入研究**事件循环和异步编程**,您将了解 JavaScript 如何处理并发、回调、承诺和事件循环。敬请期待!