ES6之Promise、Class类与模块化(Modules)

news2025/1/18 11:49:38

目录

  • Promise
  • Class类
    • extends
    • super
  • Modules 模块系统
    • export default 和对应import
    • export 和 import

Promise

  • Promise 是 ES6 引入的一种用于处理异步操作的对象。
    它解决了传统回调函数(callback)模式中容易出现的回调地狱和代码可读性差的问题。

  • Promise 对象有三种状态:

    1. Pending(进行中): 初始化状态,表示异步操作还在进行中。
    2. Fulfilled(已成功): 表示异步操作执行成功,并且返回了一个值。
    3. Rejected(已失败): 表示异步操作执行失败,抛出一个错误或异常。
  • Promise 对象具有以下特点:

    1. Promise 构造函数接收一个执行器函数(executor),该函数具有两个参数:resolve reject
      • 通过调用resolve 函数,将 Promise 对象从进行中状态变为已成功状态;
      • 通过调用 reject 函数,将 Promise 对象从进行中状态变为已失败状态。
    2. then() 方法用于指定异步操作成功后的回调函数,并且可以链式调用多个 then() 方法。每个then() 方法都返回一个新的Promise 对象。
    3. catch() 方法用于指定异步操作失败时的回调函数,也可以链式调用多个 catch() 方法,本质是then的特例。catch() 方法也返回一个新的Promise 对象。
    4. finally() 方法用于指定无论异步操作成功或失败,最终都需要执行的回调函数。finally() 方法也会返回一个新的Promise 对象。
    5. Promise.resolve();Promise.reject();方法;在这里插入图片描述
      • Promise.resolve();参数

        • 参数是Promise实例对象时,直接返回这个Promise对象
        • 参数是具有then方法的对象时,会立即执行它的then方法
        • 参数是其他值时,相当于通过resolve函数传参
      • Promise.reject();参数

        • 不管什么参数,都会原封不动地向后传递,作为后续方法的参数
        const thenable =
        	then(resolve,reject){
        	resolve('success');
        	// reject('reason');
        ;
        Promise.resolve(thenable).then(
        	data => console.log(data),
        	err => console.log(err)
        );
        
    6. Promise.all() 方法接受一个 Promise 数组作为参数(只要是可以遍历的都可以作为参数,下同),返回一个新的 Promise 对象。只有当所有的Promise对象都成功时,才会返回一个成功的结果数组;只要有一个 Promise 对象失败,就会返回一个失败的结果。
    7. Promise.race() 方法接受一个Promise 数组作为参数,返回一个新的 Promise 对象。只要数组中的一个Promise 对象完成(无论成功或失败),就会返回该Promise 对象第一个完成的结果。
    8. Promise.allsettled()方法,数组中的任意一个 Promise 对象完成(无论成功或失败),就会返回该Promise 对象对应的结果。
  • 示例:

    // 创建一个异步操作,2秒后返回结果
    const fetchData = () => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          const data = "Hello, Promise!";
          resolve(data);
        }, 2000);
      });
    };
    
    // 调用异步操作,并在操作成功后执行回调函数
    fetchData()
      .then((data) => {
        console.log(data); // 输出: "Hello, Promise!"
      })
      .catch((error) => {
        console.error(error);
      })
      .finally(() => {
        console.log("Promise operation finished.");
      });
    

Class类

在JavaScript中,类(Class)是一种用于创建对象的蓝图。类是一种构造函数的语法糖,它提供了一种更简洁、直观的方式来定义对象和其行为。

通过使用类,可以创建多个具有相同属性和方法的对象,并且可以方便地复用和扩展代码。

以下是使用class关键字定义类的示例:

class Person {
  constructor(name, age) { //constructor是一个特殊的方法,用于在创建对象时初始化对象的属性
    this.name = name;
    this.age = age;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
  }
}

要创建Person类的对象,使用new关键字:

const person1 = new Person('Alice', 25);
const person2 = new Person('Bob', 30);

person1.sayHello(); // 输出:Hello, my name is Alice and I'm 25 years old.
person2.sayHello(); // 输出:Hello, my name is Bob and I'm 30 years old.

extends

通过使用extends关键字,我们可以创建一个继承自另一个类的子类:

class Student extends Person {
  constructor(name, age, grade) {
    super(name, age); // auper()调用父类的构造函数
    this.grade = grade;
  }

  study() {
    console.log(`${this.name} is studying in grade ${this.grade}.`);
  }
}

const student = new Student('Carol', 18, '12th');
student.sayHello(); // 输出:Hello, my name is Carol and I'm 18 years old.
student.study(); // 输出:Carol is studying in grade 12th.

super

super 有两种用法:

  1. 在子类的构造函数中,用于调用父类的构造函数。通过 super() 可以在子类的构造函数中调用父类的构造函数,并传递需要的参数。

  2. 在子类中,用于调用父类的方法。通过 super.methodName() 的形式来调用父类中的方法。

示例:

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  getName() {
    return this.name;
  }
  
  speak() {
    console.log(`${this.name} makes a sound`);
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // 调用父类的构造函数
    this.breed = breed;
  }
  
  getBreed() {
    return this.breed;
  }
  
  speak() {
    super.speak(); // 调用父类的speak方法
    console.log(`${this.name} barks`);
  }
}

const dog = new Dog('Buddy', 'Labrador Retriever');
console.log(dog.getName()); // 输出: Buddy
console.log(dog.getBreed()); // 输出: Labrador Retriever
dog.speak(); // 输出: Buddy makes a sound \n Buddy barks

注意:

  • 调用父类方法时,super 必须在子类的构造函数或方法内部使用。
  • 静态方法中的 ​super​ 用于调用父类的静态方法,而不是实例方法。只能通过类名来调用静态方法,例如 ​super.staticMethod()​。
  • super代表父类的原型对象
  • 通过super调用父类的方法时,方法的this指向当前的子类实例

Modules 模块系统

在 JavaScript 中,模块(Module)是将一段代码封装成可重用和独立的单元。模块提供了一种组织和管理代码的方式,使代码更易于理解、维护和扩展。

在早期版本的 JavaScript 中,并没有内置的模块系统,但现代的 JavaScript 引擎(如Node.js和浏览器中的ES6模块)已经支持对模块的原生语法和功能。以下是关于模块的一些常见特性:

  1. 导出(Export):模块中的代码可以通过导出机制暴露给其他模块使用。通过使用 export 关键字,我们可以将变量、函数、类等从一个模块中导出。

  2. 导入(Import):模块可以导入来自其他模块的代码。通过使用 import 关键字,我们可以引入其他模块导出的内容,并在当前模块中使用。

  3. 默认导出(Default Export):一个模块可以有一个默认导出,即默认导出一个值(变量、函数、类等)。默认导出不需要使用花括号,而是直接通过 export default 导出,并且可以在导入时使用任意名称

  4. 命名导出(Named Export):除了默认导出,模块还可以使用命名导出。通过给导出的值命名并使用 export 关键字进行导出,其他模块可以通过在导入时使用相应的名称进行引用。

  5. 导入和导出的语法:模块的导入和导出可以有不同的语法形式,具体取决于使用的 JavaScript 平台和环境。在 Node.js 环境中,使用 requiremodule.exportsexports 进行导入和导出;在现代浏览器中,使用 ES6 模块语法,即 importexport 关键字。

示例:

// filename: math.js
export function add(a, b) {
  return a + b;
}

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

// filename: main.js
import { add, subtract } from './math.js';

console.log(add(5, 3)); // 输出: 8
console.log(subtract(10, 4)); // 输出: 6

export default 和对应import

在 JavaScript 的模块系统中,除了可以使用 export 关键字来导出具名的变量、函数或类以外,还可以使用 export default 关键字来导出一个默认值。导出默认值时,可以在导入时使用任意名称。

用法:

  1. 导出默认值:

    • 在导出模块中,可以使用 export default 导出一个默认值,一个模块仅能有一个默认导出
      // 在导出模块中
      export default "Hello!";  // 导出字符串默认值
      export default {        // 导出对象默认值
        name: "John",
        age: 25
      };
      export default function sayHello() {  // 导出函数默认值
        console.log("Hello!");
      }
      
  2. 导入默认值:

    • 在导入模块中,可以使用任意名称导入默认值。不同于具名导入需要使用花括号 {},默认导入直接将值引入到变量中。
      // 在导入模块中
      import myDefault from "./exportDefaultModule.js";
      console.log(myDefault);  // 输出: "Hello!" 或{ name: "John", age: 25 } 或 函数输出
      
      // 如果导出的是一个对象,则可以直接访问其属性
      import myDefault from "./exportDefaultModule.js";
      console.log(myDefault.name);  // 输出: "John"
      

注意: 导入默认值时不需要使用花括号 {}。而且,在一个模块中,通过 export default 导出的默认值不能直接和其他具名导出一起使用。

// 在导出模块中
const myVar = "Hello!";
export default myVar;        // 正确

export default function() {  // 正确
  console.log("Goodbye!");
}

// 错误示例
export const name = "John";
export default myVar;      // 错误!不能同时具名导出和默认导出
// 在导入模块中
import myDefault, { name } from "./exportDefaultModule.js";   // 错误!不能同时导入默认值和具名导出的变量

import myDefault from "./exportDefaultModule.js";            // 正确

export 和 import

在 JavaScript 的模块系统中,export 用于将模块的内容导出,import 用于导入其他模块的内容。下面是关于 exportimport 的各种用法:

  1. 基本用法:

    • 导出单个变量、函数或类:

      // 在导出模块中
      export const name = "John";
      export function sayHello() {
        console.log("Hello!");
      }
      export class Person {
        constructor(name) {
          this.name = name;
        }
      }
      
    • 导入并使用导出的变量、函数或类:

      // 在导入模块中
      import { name, sayHello, Person } from "./exportModule.js";
      console.log(name); // 输出: "John"
      sayHello(); // 输出: "Hello!"
      const person = new Person("Alice");
      console.log(person.name); // 输出: "Alice"
      
  2. 多个导出:

    • 可以在一个 export 语句中同时导出多个内容:

      export { name, sayHello };
      
    • 在导入时,可以使用相同的语法导入多个内容:

      import { name, sayHello } from "./exportModule.js";
      
  3. 导出导入时起别名:

    • 可以使用 as 关键字为导出和导入的内容设置别名:
      // 在导出模块中
      export { name as myName };
      
      // 在导入模块中
      import { myName as name } from "./exportModule.js";
      console.log(name); // 输出: "John"
      
  4. 整体导入:

    • 通过使用 * 关键字,可以将一个模块的所有导出内容作为单个对象进行导入:
      // 在导入模块中
      import * as myModule from "./exportModule.js";
      console.log(myModule.name); // 输出: "John"
      myModule.sayHello(); // 输出: "Hello!"
      
  5. 同时导入:

    • 当导入模块的内容较多时,可以使用 import 关键字一次性导入多个内容,并将它们作为别名的属性:
      // 在导入模块中
      import { name, sayHello, Person } from "./exportModule.js";
      

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

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

相关文章

Vue.js2+Cesium 四、WMS 服务加载,控制自图层显隐

Vue.js2Cesium 四、WMS 服务加载&#xff0c;控制自图层显隐 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"><div class"layer_container"><button id"btn">清除</button&g…

大模型开发(十六):从0到1构建一个高度自动化的AI项目开发流程(中)

全文共1w余字&#xff0c;预计阅读时间约40~60分钟 | 满满干货(附代码)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;通过LtM提示流程实现自动构建符合要求的函数&#xff0c;并通过实验逐步完整测试code_generate函数功能。 代码下载点这里 一、介绍 此篇文章为…

Redis两种持久化方案RDB持久化和AOF持久化

Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启…

docker---网络

docker网络 使用–publish或-p标志使端口可用于 Docker 外部的服务。这会在主机中创建一条防火墙规则&#xff0c;将容器端口映射到 Docker 主机上通往外界的端口。 -p 8080:80&#xff1a;将容器中的TCP端口80映射到Docker主机上的端口8080。 -p 192.168.1.100:8080:80&…

说明学习委员之作业管理系统—后端部分

项目背景 学习委员收集作业的过程&#xff0c;繁琐且曲折&#xff0c;作者充分理解并体谅为大家服务的苦逼学习委员&#xff0c;以此为出发点和灵感&#xff0c;设计并开发了此套作业管理系统&#xff0c;希望能帮助各位提高效率&#xff0c;早日摆脱重复机械式的工作&#xf…

Vue3和TypeScript_页面

1 在views下新建myView.view 2 在router文件夹里&#xff0c;配置路径&#xff0c;按需引入组件 3 浏览器通过路径访问页面

pycharm——涟漪散点图

from pyecharts import options as opts from pyecharts.charts import EffectScatterc (EffectScatter().add_xaxis( ["高等数学1&#xff0c;2","C语言程序设计","python程序设计","大数据导论","数据结构","大数据…

旺店通·企业奇门和用友U8接口打通对接实战

旺店通企业奇门和用友U8接口打通对接实战 接通系统&#xff1a;旺店通企业奇门 慧策最先以旺店通ERP切入商家核心管理痛点——订单管理&#xff0c;之后围绕电商经营管理中的核心管理诉求&#xff0c;先后布局流量获取、会员管理、仓库管理等其他重要经营模块。慧策的产品线从旺…

QT学习笔记-QT5.15 + MSVC编译套件时编译日志及运行日志日志乱码解决

QT学习笔记-QT5.15 MSVC编译套件时编译日志及运行日志日志中文乱码解决 0、基础环境1、QtCreator中的基本设置编辑->首选项->文本编辑器 2、问题1&#xff1a;MSVC编译日志乱码问题解决问题描述解决方法 3、问题2&#xff1a;MSVC构建套件编译后程序运行日志乱码问题问题…

多雷达探测论文阅读笔记:雷达学报 2023, 多雷达协同探测技术研究进展:认知跟踪与资源调度算法

多雷达协同探测技术 原始笔记链接:https://mp.weixin.qq.com/s?__biz=Mzg4MjgxMjgyMg==&mid=2247486627&idx=1&sn=f32c31bfea98b85f2105254a4e64d210&chksm=cf51be5af826374c706f3c9dcd5392e0ed2a5fb31ab20924b7dd38e1b1ae32abe9a48afa8174#rd ↑ \uparrow …

Redis—全局命令

Redis—全局命令 &#x1f50e;get / set&#x1f50e;常用全局命令keysexistsdelexpirettlkey 的过期策略type Redis 官网 Redis 中的命令不区分大小写 进入 Redis 客户端 redis-cli -h Redis 服务器的 IP 地址 -p Redis 服务器的端口号省略 -h 表示 Redis 服务器的 IP 地址…

【ASP.NET MVC】数据库访问(5)

一、ORM简介 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 以上是官话&#xff0c;个人理解&#xff1a; 1、解决问题&#xff1a;数据库的访问 2、如何解决&a…

Vue路由:Vue Router

Vue Router 介绍 Vue Router 是 Vue.js (opens new window) 官方的路由管理器。 核心深度集成&#xff0c;包含的功能有&#xff1a; 嵌套的路由/视图表 模块化的、基于组件的路由配置 路由参数、查询、通配符基于 Vue.js 过渡系统的视图过渡效果 细粒度的导航控制 Vue Rou…

学习系统编程No.33【生产消费模型】

引言&#xff1a; 北京时间&#xff1a;2023/7/22/14:27&#xff0c;现实和预期往往相差是巨大的&#xff0c;哈哈哈&#xff01;白天睡不醒&#xff0c;晚上睡不着&#xff0c;就像一个夜猫子一样。熬夜耍手机&#xff0c;我真的是专业的&#xff0c;已经连续好久没有正常睡过…

【C++】类和对象 - 中

目录 1. 类的6个默认成员函数2. 构造函数2.1 概念2.2 特性3.3 默认构造函数 3. 析构函数3.1 概念3.2 特性 4. 拷贝构造函数4.2 概念4.3 特性4.3 传参或作返回值 5. 赋值运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 前后置 --重载5.4 自定义类型的输出输出 6. const成员函数…

SAP MM学习笔记15-物料调达中的Master数据(1)-仕入先Master

SAP中做一个购买发注的时候&#xff0c;涉及到以下Master数据&#xff1a; 1&#xff0c;仕入先Master&#xff08;供应商&#xff09;&#xff1a;跟谁买 2&#xff0c;品目Master&#xff08;物料&#xff09;&#xff1a;买什么 3&#xff0c;购买情报&#xff1a;什么价…

电脑误删除环境变量Path

今天在搞环境变量 一不注意手一滑把Path删除了&#xff0c;当时惊了一身冷汗&#xff0c;幸好看见有别人讲的补救措施&#xff0c;赶紧记录一下&#xff1a; 首先进入注册表winR&#xff0c;输入regedit&#xff1a; 在注册表编辑器中进入到【HKEY_LOCAL_MACHINE\SYSTEM\Contr…

基于 STM32自研多任务+SpringBoot+Vue 农业大棚智能调光系统

工作以后常常容易感到疲于奔命&#xff0c;即使在周末也没有得到高质量的休息。打工人/学生党如何过周末&#xff1f;你有哪些延长周末和下班时间的好方法吗&#xff1f;- 方法就是多积累&#xff0c;多发博客&#xff0c;将感悟全写出来&#xff01;&#xff01;&#xff0c;接…

Python——调用webdriver.Chrome() 报错

今天运行脚本&#xff0c;报错内容如下&#xff1a; collecting ... login_case.py:None (login_case.py) login_case.py:11: in <module> dr webdriver.Chrome() D:\Program Files (x86)\Python\Python39\Lib\site-packages\selenium\webdriver\chrome\webdriver.p…

改造 dify 项目适配自建的 OpenAI API 服务

改造 dify 项目适配自建的 OpenAI API 服务 0. 背景1. 修改默认的 api_base 地址2. 修改 openai_provider.py3. 重新构建 docker 镜像4. 修改 docker-compose.yaml5. 启动项目 0. 背景 项目 https://github.com/langgenius/dify.git 的 OpenAI 配置项目里&#xff0c;现在(202…