摘要:async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用。 async function 让我们以 async 这个关键字开始。它可以被放置在一个函数前面,如下所示: async function f() { return 1; } 在函数前面的 “a
阅读全文
摘要:promise 的处理程序 .then、.catch 和 .finally 都是异步的。 即便一个 promise 立即被 resolve,.then、.catch 和 .finally 下面 的代码也会在这些处理程序之前被执行。 示例代码如下: let promise = Promise.reso
阅读全文
摘要:对于一个简单的转换来说 “Promisification” 是一个长单词。它指将一个接受回调的函数转换为一个返回 promise 的函数。 由于许多函数和库都是基于回调的,因此,在实际开发中经常会需要进行这种转换。因为使用 promise 更加方便,所以将基于回调的函数和库 promise 化是有意
阅读全文
摘要:在 Promise 类中,有 6 种静态方法。我们在这里简单介绍下它们的使用场景。 Promise.all 假设我们希望并行执行多个 promise,并等待所有 promise 都准备就绪。 例如,并行下载几个 URL,并等到所有内容都下载完毕后再对它们进行处理。 这就是 Promise.all 的
阅读全文
摘要:promise 链在错误(error)处理中十分强大。当一个 promise 被 reject 时,控制权将移交至最近的 rejection 处理程序。这在实际开发中非常方便。 例如,下面代码中所 fetch 的 URL 是错的(没有这个网站),.catch 对这个 error 进行了处理: fet
阅读全文
摘要:我们有一系列的异步任务要一个接一个地执行 —— 例如,加载脚本。我们如何写出更好的代码呢? Promise 提供了一些方案来做到这一点。 在本章中,我们将一起学习 promise 链。 它看起来就像这样: new Promise(function(resolve, reject) { setTime
阅读全文
摘要:想象一下,你是一位顶尖歌手,粉丝没日没夜地询问你下首歌什么时候发。 为了从中解放,你承诺(promise)会在单曲发布的第一时间发给他们。你给了粉丝们一个列表。他们可以在上面填写他们的电子邮件地址,以便当歌曲发布后,让所有订阅了的人能够立即收到。即便遇到不测,例如录音室发生了火灾,以致你无法发布新歌
阅读全文
摘要:⚠️ 我们在这里的示例中使用了浏览器方法 为了演示回调、promise 和其他抽象概念的使用,我们将使用一些浏览器方法:具体地说,是加载脚本和执行简单的文档操作的方法。 但是,我们会尽全力使讲解变得更加清晰。在这儿不会有浏览器方面的真正复杂的东西。 JavaScript 主机(host)环境提供了许
阅读全文
摘要:当我们在开发某些东西时,经常会需要我们自己的 error 类来反映在我们的任务中可能出错的特定任务。对于网络操作中的 error,我们需要 HttpError,对于数据库操作中的 error,我们需要 DbError,对于搜索操作中的 error,我们需要 NotFoundError,等等。 我们自
阅读全文
摘要:不管你多么精通编程,有时我们的脚本总还是会出现错误。可能是因为我们的编写出错,或是与预期不同的用户输入,或是错误的服务端响应以及其他数千种原因。 通常,如果发生错误,脚本就会“死亡”(立即停止),并在控制台将错误打印出来。 但是有一种语法结构 try...catch,它使我们可以“捕获(catch)
阅读全文
摘要:在 JavaScript 中,我们只能继承单个对象。每个对象只能有一个 [[Prototype]]。并且每个类只可以扩展另外一个类。 但是有些时候这种设定(译注:单继承)会让人感到受限制。例如,我有一个 StreetSweeper 类和一个 Bicycle 类,现在想要一个它们的 mixin:Str
阅读全文
摘要:instanceof 操作符用于检查一个对象是否属于某个特定的 class。同时,它还考虑了继承。 在许多情况下,可能都需要进行此类检查。例如,它可以被用来构建一个 多态性(polymorphic) 的函数,该函数根据参数的类型对参数进行不同的处理。 instanceof 操作符 语法: obj i
阅读全文
摘要:内建的类,例如 Array,Map 等也都是可以扩展的(extendable)。 例如,这里有一个继承自原生 Array 的类 PowerArray: // 给 PowerArray 新增了一个方法(可以增加更多) class PowerArray extends Array { isEmpty()
阅读全文
摘要:面向对象编程最重要的原则之一 —— 将内部接口与外部接口分隔开来。 在开发比 “hello world” 应用程序更复杂的东西时,这是“必须”遵守的做法。 为了理解这一点,让我们脱离开发过程,把目光转向现实世界。 通常,我们使用的设备都非常复杂。但是,将内部接口与外部接口分隔开来可以让我们使用它们且
阅读全文
摘要:我们可以把一个方法作为一个整体赋值给类。这样的方法被称为 静态的(static)。 在一个类的声明中,它们以 static 关键字开头,如下所示: class User { static staticMethod() { console.log(this User); } } User.static
阅读全文
摘要:类继承是一个类扩展另一个类的一种方式。 因此,我们可以在现有功能之上创建新功能。 “extends” 关键字 假设我们有 class Animal: class Animal { constructor(name) { this.speed = 0; this.name = name; } run(
阅读全文
摘要:在日常开发中,我们经常需要创建许多相同类型的对象,例如用户(users)、商品(goods)或者任何其他东西。 正如我们在 构造器和操作符 "new" 一章中已经学到的,new function 可以帮助我们实现这种需求。 但在现代 JavaScript 中,还有一个更高级的“类(class)”构造
阅读全文
摘要:在这部分内容的第一章中,我们提到了设置原型的现代方法。 使用 obj.__proto__ 设置或读取原型被认为已经过时且不推荐使用(deprecated)了(已经被移至 JavaScript 规范的附录 B,意味着仅适用于浏览器)。 现代的获取/设置原型的方法有: Object.getPrototy
阅读全文
摘要:"prototype" 属性在 JavaScript 自身的核心部分中被广泛地应用。所有的内建构造函数都用到了它。 首先,我们将看看原生原型的详细信息,然后学习如何使用它为内建对象添加新功能。 Object.prototype 假如我们输出一个空对象: let obj = {}; console.l
阅读全文
摘要:我们还记得,可以使用诸如 new F() 这样的构造函数来创建一个新对象。 如果 F.prototype 是一个对象,那么 new 操作符会使用它为新对象设置 [[Prototype]]。 ❗️ 请注意: JavaScript 从一开始就有了原型继承。这是 JavaScript 编程语言的核心特性之
阅读全文