生成器
生成器函数有哪些定义形式?
- 特征: 函数名前加
*;
function* generatorFn() {} // 函数声明
const generatorFn2 = function* () {}; // 函数表达式
const foo = { *generatorFn() {} }; // 对象字面量方法
class Foo {
*generatorFn() {} // 类实例方法
static *staticFn() {} // 类静态方法
}
- 限制: 箭头函数不能定义为生成器;
生成器如何作为默认迭代器使用?
- 用法: 把
*[Symbol.iterator]()定义在类或对象上, 用yield依次产出值;
class Person {
constructor() {
this.nicknames = ["Jack", "Jake", "J-Dog"];
}
*[Symbol.iterator]() {
yield* this.nicknames.entries();
}
}
[...new Person()]; // [[0, 'Jack'], [1, 'Jake'], [2, 'J-Dog']]
- 迭代方式: 生成器对象本身是迭代器, 通过
next()驱动, 协议细节见 迭代器; - 类中定义: 实例方法生成器定义在原型上, 静态方法生成器定义在类上;
class Person {
*createNicknameIterator() {
yield "Jack";
yield "Jake";
}
static *createJobIterator() {
yield "Butcher";
}
}
Person.createJobIterator().next().value; // "Butcher"
new Person().createNicknameIterator().next().value; // "Jack"
- 源码边界: 上游笔记中
yield的中断执行、生成器作为默认迭代器与提前终止仅保留标题, 未留下可核对内容, 此处不补写;