JavaScript class 中生成器方法需用标识,返回Generator对象,支持yield暂停恢复;分实例(method)和静态(static *method)两种,this指向调用者,不可用箭头函数,常用于懒加载、分页、状态机等场景。

在 JavaScript 的 class 语法中,定义生成器方法只需在方法名前加上 *(星号),且该方法会返回一个 Generator 对象,支持 yield 暂停与恢复执行。
基本写法:用 * 标识生成器方法
生成器方法不是普通函数,它必须以 * 开头,可以是实例方法,也可以是静态方法:
- 实例生成器方法:直接定义在 class 内部,通过实例调用
- 静态生成器方法:用
static *声明,通过类名调用
示例:
class Counter {
constructor(start = 0) {
this.current = start;
}
<p>// 实例生成器方法
*countUp(times) {
for (let i = 0; i < times; i++) {
yield this.current++;
}
}</p><p>// 静态生成器方法
static *range(from, to) {
for (let i = from; i < to; i++) {
yield i;
}
}
}</p><p>// 使用实例生成器
const c = new Counter(10);
for (const val of c.countUp(3)) {
console.log(val); // 10, 11, 12
}</p><p>// 使用静态生成器
for (const n of Counter.range(0, 3)) {
console.log(n); // 0, 1, 2
}注意 this 的行为
生成器方法中的 this 指向调用它的实例(或类),和普通方法一致。但要注意:生成器函数本身不立即执行,只在首次调用 next() 或进入 for...of 时才开始运行。
立即学习“Java免费学习笔记(深入)”;
- 不能在生成器方法内使用箭头函数替代
function*—— 箭头函数不支持yield -
yield只能在生成器函数内部使用,否则报错 - 生成器方法不能是异步的(如
async *method()是合法语法,但那是异步生成器,需配合await和for await...of)
常见用途场景
生成器方法适合需要按需产出数据、避免一次性构造大数组、或实现懒求值逻辑的场景:
- 遍历树形结构(如 DOM 节点、嵌套对象)
- 分页请求的数据流(每次 yield 一页结果)
- 状态机或有限步骤流程(每步 yield 当前状态)
- 模拟无限序列(如斐波那契、自然数列)


















