在 javascript 类中定义生成器方法需在方法名前加星号 并使用 yield,调用返回 generator 对象,支持 for...of 和 next(); 必须紧贴方法名,不可用于箭头函数。

在 JavaScript 的类中定义生成器方法,只需在方法名前加一个星号 *,并且该方法内部使用 yield 关键字来产出值。生成器方法返回的是一个 Generator 对象,它实现了迭代器协议(可被 for...of 遍历、可用 next() 手动调用)。
生成器方法的基本写法
类中的生成器方法和其他普通方法一样写在类体里,但语法上必须:
- 方法名前带
*(星号紧贴function关键字或方法名,无空格) - 函数体内使用
yield表达式暂停执行并返回值 - 调用时不会立即执行,而是返回一个可迭代的 Generator 实例
class Counter {
constructor(max) {
this.max = max;
}
// ✅ 正确:生成器方法
*countUp() {
for (let i = 0; i <h3>注意 <code>*</code> 的位置和常见错误</h3>
-
*属于方法定义的一部分,不是修饰符,不能写成function*(那是函数声明写法,类中不适用) - 错误写法示例:
class Bad { function* badGen() {} // ❌ 类中不能用 function* 语法 * badGen() {} // ✅ 正确:* 紧挨方法名 }
可以配合箭头函数吗?
不可以。生成器不能用箭头函数定义,因为箭头函数没有 this 绑定机制,也不支持 yield,且语法上不允许 => 和 * 共存。
class NoArrow {
//* count = () => {} // ❌ 语法错误,箭头函数不能是生成器
}
实际用途举例:遍历私有数据或惰性计算
生成器适合封装内部状态、按需产出结果,比如遍历类内部数组、实现分页、或模拟异步流:
class TaskQueue {
constructor(tasks) {
this.tasks = tasks;
}
*runTasks() {
for (const task of this.tasks) {
console.log('Running:', task);
yield task.toUpperCase();
}
}
}
const queue = new TaskQueue(['login', 'fetch', 'render']);
for (const result of queue.runTasks()) {
console.log('Result:', result); // LOGIN, FETCH, RENDER
}
不复杂但容易忽略:只要记住 * + yield + 返回 Generator 就行,其余逻辑和普通方法一致。











