要让实例支持 for...of 循环,需在类中定义 [symbol.iterator] 方法,返回符合迭代器协议的对象(含 next() 方法);推荐用生成器函数实现,如 *[symbol.iterator]() { for (const item of this.items) yield item; }。

在 JavaScript class 中,要让实例支持 for...of 循环,需在类中定义一个名为 [Symbol.iterator] 的方法,该方法必须返回一个符合迭代器协议的对象(即包含 next() 方法的对象)。
定义 [Symbol.iterator] 方法
这是关键步骤:方法名必须是计算属性名 [Symbol.iterator],不能写成字符串 "Symbol.iterator" 或其他形式。它应返回一个对象,该对象的 next() 方法每次调用返回形如 { value: ..., done: true|false } 的结果。
- 通常返回一个生成器函数(
function*)或手动实现的迭代器对象 - 若用生成器,直接
return this[Symbol.iterator] = function*() { ... }或在方法体内用yield - 注意:该方法必须是普通函数(不能是箭头函数),否则无法正确绑定
this
常见实现方式:使用生成器函数
最简洁自然的方式是让 [Symbol.iterator] 返回一个生成器函数。例如,遍历类内部保存的数组:
class MyList {
constructor(items = []) {
this.items = items;
}
*[Symbol.iterator]() {
for (const item of this.items) {
yield item;
}
}
}
const list = new MyList([10, 20, 30]);
for (const x of list) {
console.log(x); // 10, 20, 30
}
手动实现迭代器对象(非生成器)
适合需要精细控制状态或不依赖生成器的场景。需维护内部索引,并在 next() 中返回对应值和完成状态:
class MyList {
constructor(items = []) {
this.items = items;
}
[Symbol.iterator]() {
let index = 0;
const items = this.items;
return {
next() {
if (index
<h3>注意事项与易错点</h3>
<p>实际使用中容易忽略以下细节:</p>
-
[Symbol.iterator]必须是**可枚举的**(默认方法就是可枚举的,无需额外设置) - 返回的迭代器对象的
next()方法必须始终返回规范对象(含value和done属性) - 若类逻辑涉及异步数据,
[Symbol.iterator]本身不能是async;如需异步迭代,应使用[Symbol.asyncIterator]并配合for await...of - 不要在构造函数里提前绑定
this[Symbol.iterator]为箭头函数——会丢失this.items上下文
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











