AltSchool Of Engineering Tinyuka’24 第5月第2周
本周我们照例从回顾上节内容开始。若您错过之前课程,可在此补课。随后我们直接进入本周主题:JavaScript中的原型与继承。让我们一起探索这些核心概念!
原型与继承
在JavaScript中,原型是允许对象从其他对象继承属性和方法的核心特性,此概念称为原型继承。例如,若您有一个构造函数Animal,可通过其原型(Animal.prototype)创建继承自Animal的实例dog。这会形成原型链,使dog能访问Animal中定义的属性和方法。
原生原型与原型方法
JavaScript为内置对象(如Array和Function)提供原生原型。例如,您可向Array.prototype添加自定义方法,使所有数组实例都能使用此新方法。
类基本语法
随着ES6的引入,JavaScript支持类语法,使创建对象和处理继承更简便。基本类定义如下:
|
|
类继承
类可扩展其他类,实现清晰的继承结构。例如:
|
|
静态属性与方法
类还可定义属于类本身而非实例的静态属性和方法。例如:
|
|
私有与受保护属性及方法
ES2022引入了类中的私有属性和方法,以#前缀标识。例如:
|
|
这些私有成员在类外不可访问。
扩展内置类
您可扩展内置类(如Array或Error)以创建专用版本。例如:
|
|
类检查Instanceof与混入
要检查对象是否为类的实例,可使用instanceof运算符。例如:
|
|
混入可用于在不使用传统继承的情况下跨类共享功能,实现灵活代码复用。
错误处理概述
编程中,错误可能源于多种来源,导致意外行为。JavaScript通过try...catch语句提供健壮的错误管理机制,允许开发者处理异常而不中断脚本执行。
Try Catch结构
try...catch语句包含可能抛出错误的try代码块,后接若发生错误则执行的catch块。此外,可包含finally块,无论是否抛出错误均会运行。
执行流程
- Try块:放置可能引发错误的代码。
- Catch块:若发生错误,控制权转移至
catch块,可在此优雅处理错误。 - Finally块:若存在,在
try和catch后执行,确保清理代码运行。
示例
以下简单示例演示try...catch用法:
|
|
此示例中:
- 若
riskyFunction()抛出错误,catch块记录错误消息。 - 无论是否发生错误,
finally块均执行,允许必要清理。
同步特性
try...catch语句同步操作,意味着以线性方式执行代码,确保错误按顺序捕获和处理。
理解Catch绑定
当try块内发生错误时,触发catch块。此块接收错误对象(常称为exceptionVar,通常命名为err),包含错误关键信息。
错误对象属性
错误对象提供有价值细节,包括:
- Message:错误描述。
- Type:发生的错误类型。
- Stack:堆栈跟踪(虽非标准但广泛支持),通过显示导致错误的调用路径辅助调试。
解构错误对象
可使用解构从错误对象简洁提取多个属性,使代码更清晰且易于访问必要信息。
示例
以下示例演示catch绑定和解构:
|
|
此示例中:
- 当
riskyOperation()发生错误时,catch块解构错误对象,直接访问message、name和stack。 - 这不仅简化代码,还增强可读性,使记录和调试错误更轻松。
有效使用catch绑定帮助开发者管理异常并收集错误有意义的见解,提升应用整体健壮性。
创建自定义错误
在JavaScript中,可通过内置Error类创建自定义错误类型以增强错误处理。此方法允许开发者定义更符合应用上下文且更有意义的错误。
自定义错误优势
自定义错误使您能提供定制消息和附加属性,更易理解错误性质。此特性在需区分捕获和处理不同错误场景时尤为有用。
基本实现
创建自定义错误只需扩展Error类。以下为简单示例:
|
|
此示例中:
ValidationError是扩展Error的自定义错误类。- 当抛出
ValidationError实例时,携带特定消息并有 distinct 名称,易于识别。 catch块记录错误类型和消息,为调试提供清晰上下文。
引言
在JavaScript中,回调是作为参数传递给其他函数的函数,支持异步操作。然而,它们可能导致复杂难管理的代码,常称为“回调地狱”。
Promise基础
Promise为处理异步操作提供更简洁的替代方案。Promise表示可能现在、将来或永远不可用的值,可处于三种状态之一:pending、fulfilled或rejected。例如:
|
|
Promise链式调用
Promise可使用.then()方法链式调用,允许异步任务顺序执行。每个.then()返回新promise:
|
|
Promise错误处理
Promise中的错误可使用.catch()方法捕获,处理promise链中的任何拒绝:
|
|
Promise API
JavaScript提供内置Promise API,包含如Promise.all()(用于同时处理多个promise)和Promise.race()(在任一promise解决或拒绝时立即解决)等方法。
Promisify
您可使用称为“promisification”的技术将基于回调的函数转换为promise,实现更简洁的异步代码。例如:
|
|
微任务
Promise在微任务队列中执行,允许它们在下次事件循环迭代前完成,确保promise解决被及时处理。
Async/Await
ES2017引入的async/await提供更同步的方式编写异步代码。async函数返回promise,await关键字暂停执行直至promise解决:
|
|
什么是模块?
在JavaScript中,模块本质上是封装代码的单个文件,使其能高效组织和复用。模块可使用export和import关键字相互交互,促进功能在应用不同部分共享。
模块化重要性
模块化在大型软件开发中至关重要,它将应用分解为可管理、可互换的组件。此方法增强可维护性和可扩展性,使开发和更新代码更轻松。
导出与导入
export关键字用于指定哪些变量和函数应从模块外部访问。例如:
|
|
要在另一模块中使用这些导出函数,可使用import语句:
|
|
什么是导入?
JavaScript中的导入是将导出代码从一模块引入另一模块的过程。此功能对于集成各种组件和库至关重要,使开发者能高效构建复杂应用。
导入语法
一种常见导入代码的方式是使用语法import * as。此方法导入模块所有导出元素并将其分配给单个对象,使访问多个导出更轻松,无需单独导入每个。
导入所有导出示例
考虑名为utils.js的模块,它导出多个实用函数:
|
|
您可如下将所有函数导入另一文件:
|
|
花括号特定导入
若仅需导入特定元素,可使用花括号显式列出它们:
|
|
什么是动态导入?
动态导入提供在JavaScript中加载模块的灵活方法,与传统静态导入形成鲜明对比。静态导入要求所有模块在脚本启动时加载,可能导致较长初始加载时间,而动态导入允许按需加载模块。此方法可显著提升性能并增强用户体验。
静态与动态导入对比
静态导入中,模块预先加载:
|
|
相反,动态导入使用基于promise的语法,使模块能按需加载:
|
|
动态导入优势
动态导入在应用某些部分有条件要求或非立即需要时尤为有用。此能力允许开发者实现代码分割,减少初始包大小并改善加载时间。
示例用例
例如,若您有仅在特定条件下使用的功能(如设置页面),可在用户导航至该页面时动态导入:
|
|
我是Ikoh Sylva,热情的云计算爱好者,拥有AWS实践经验。我从初学者视角记录我的云旅程,旨在激励他人。 若您觉得我的内容有帮助,请点赞关注我的帖子,并考虑与开始自己云旅程的人分享此文。 让我们在社交媒体上联系。我很乐意与您交流想法! [LinkedIn] [Facebook] [X]