JavaScript类不能用声明类本身为生成器,但可在类内定义修饰的生成器方法(如[Symbol.iterator]()或values()),调用后返回迭代器,支持for...of等迭代操作。

JavaScript 中的类不能直接用 * 声明“类本身”为生成器,但可以在类内部定义一个 生成器方法(即用 * 修饰的方法),然后让这个方法返回迭代器,从而支持 for...of、Array.from() 等迭代操作。
在类中定义生成器方法(function*)
只需在类的方法前加 *,该方法就成为生成器函数,调用时返回一个迭代器对象。常用于自定义类的遍历逻辑。
- 方法名可以是任意合法标识符,但若想让实例可被
for...of遍历,需将生成器方法命名为[Symbol.iterator] -
[Symbol.iterator]是 JavaScript 迭代协议规定的“入口方法”,引擎会自动查找它来启动迭代 - 生成器方法体内可用
yield逐个产出值,每次调用迭代器的next()就执行到下一个yield
示例:让类实例可被 for...of 遍历
下面是一个计数器类,内部用生成器实现从 start 到 end 的数值迭代:
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
<p>// ✅ 正确:定义 Symbol.iterator 生成器方法
*[Symbol.iterator]() {
for (let i = this.start; i <= this.end; i++) {
yield i;
}
}
}</p><p>// 使用
const range = new Range(2, 5);
for (const num of range) {
console.log(num); // 输出: 2, 3, 4, 5
}
console.log([...range]); // [2, 3, 4, 5]
其他常见用法:命名生成器方法 + 手动调用
除了 [Symbol.iterator],你也可以定义任意名称的生成器方法(如 values()、entries()),按需调用:
立即学习“Java免费学习笔记(深入)”;
class DataList {
constructor(items) {
this.items = items;
}
<p>// 自定义生成器方法
*values() {
for (const item of this.items) yield item;
}</p><p>*entries() {
for (let i = 0; i < this.items.length; i++) {
yield [i, this.items[i]];
}
}
}</p><p>const list = new DataList(['a', 'b', 'c']);
console.log([...list.values()]); // ['a', 'b', 'c']
console.log([...list.entries()]); // [[0,'a'], [1,'b'], [2,'c']]
注意点
- 类中不能写
class* MyClass {}—— 这是语法错误,*只能修饰方法,不能修饰class声明本身 - 生成器方法仍遵循普通方法的访问控制(
public/private),私有生成器方法需用#name语法(ES2022+) - 箭头函数不能是生成器,所以不能写
myGen = *() => {};必须用function*语法(即* methodName() {})


















