这是我参与「第四届青训营 」笔记创作活动的第13天
async函数
在ES2017中引入了async函数,它能够使异步操作变为更加简便,其实本质是generator函数的语法糖。 async函数就是把generator里的 * 星号 替换成async,将 yield 替换成await。
async的优点
- 内置执行器,Generator函数的执行必须要执行器,因此需要co模块,而async函数和普通函数一样,只需要一行就可以执行。
- 更好的语义
- 更广的适用性
- 返回值是Promise对象。可以直接用then方法指定下一步的操作。 以下是例子:
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
使用注意点
- await后面的Promise对象运行结果可能是rejected,因此最好把await放在try catch中。
- 多个await命令后面的异步操作,如果不存在继发关系,最好让他们同时触发。
- await命令只能用在async函数中,否则会报错。
- async函数可以保留运行堆栈。
Class
ES6为了和传统语言的写法更加接近,引入了Class的概念,可以通过class来定义类。 他可以看作是一个语法糖,class的写法只是让对象原型的写法看起来更加清晰,看起来更加面向对象的语法。 例如:
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
类里面有一个constructor的构造方法,this代表实例对象。 在使用的时候也是直接对类使用new命令,和构造函数一致。
注意点
- 类和模块的内部默认就是严格模式,因此不需要使用use strict来指定严格模式。
- 不逊在变量提升。
- 如果某个方法前加了一个 * 星号,就表明该方法是一个generator函数。
- 如果内部有 this, 则默认指向类的实例。
Class的继承
class可以通过关键字 extends继承:
class Point {
}
class ColorPoint extends Point {
}
ES6规定,必须在constructor方法中调用super(),super表示父类的构造函数,用来新建一个父类的实例对象。
原生构造函数的继承
原生构造函数是指语言内置的构造函数,通常用来生成数据结构。ECMAScript 的原生构造函数大致有下面这些。
- Boolean()
- Number()
- String()
- Array()
- Date()
- Function()
- RegExp()
- Error()
- Object()
ES6允许继承原生构造函数定义子类。extends不仅可以用来继承类,还可以继承原生的构造函数。