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


    在这里插入图片描述
    😊博主:小猫娃来啦
    😊文章核心:优雅而高效的JavaScript—— 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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在上面的示例中,我们定义了一个名为 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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在上面的示例中,我们定义了一个 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在上面的示例中,我们定义了一个 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

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

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

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

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

    export default function multiply(a, b) {
      return a * b;
    }
    
    • 1
    • 2
    • 3

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

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

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

    模块的循环依赖问题

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

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

    import { foo } from './moduleB.js';
    
    export function bar() {
      console.log(foo());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    import { bar } from './moduleA.js';
    
    export function foo() {
      return 'Hello from moduleB.js';
    }
    
    bar();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在上面的示例中,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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在上面的示例中,我们定义了一个 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

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


    总结

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

    在这里插入图片描述


  • 相关阅读:
    如何使用决策树判断要不要去相亲?
    住房贷款等额本息(等额本金)还款计划计算
    分库分表利器——shardingJdbc
    自动化测试之路 —— Appium输入及模拟手势
    YOLO-World:实时开放词汇目标检测
    手写死锁检测组件
    用postman 推送消息到GCP的pubsub
    在 docker 容器中使用 docker
    什么是深度卷积神经网络,卷积神经网络怎么学
    Linux学习-31-Linux权限位及修改文件和目录的权限
  • 原文地址:https://blog.csdn.net/dyk11111/article/details/133883615