在自定义类中部署symbol.iterator,需在原型上定义该方法并返回符合迭代器协议的对象(含next()方法,返回{value, done});推荐用生成器函数实现,简洁且自动管理状态,也可手动实现以精细控制迭代逻辑。

在自定义类中部署 Symbol.iterator,核心是让类的实例返回一个符合迭代器协议的对象:即具有 next() 方法,该方法返回形如 { value, done } 的对象。只要实现这个接口,就能用 for...of、扩展运算符([...obj])、解构、Array.from() 等语法。
让类实例返回标准迭代器对象
最直接的方式是在类的原型上定义 Symbol.iterator 方法,该方法必须返回一个对象,且该对象有 next() 函数。通常用生成器函数(function*)最简洁,它天然满足迭代器协议;也可手动返回带 next 的对象。
- 推荐用生成器函数:写法简洁、状态自动管理、语义清晰
- 手动实现需自行维护迭代状态(如索引、是否完成),适合特殊控制逻辑
-
Symbol.iterator必须是函数,不能是箭头函数(否则无法访问this)
使用生成器函数实现(最常用)
生成器函数返回一个迭代器,开箱即用。在类中直接 yield 数据即可:
class Countdown {
constructor(start) {
this.start = start;
}
*[Symbol.iterator]() {
for (let i = this.start; i > 0; i--) {
yield i;
}
}
}
const count = new Countdown(3);
for (const num of count) {
console.log(num); // 3, 2, 1
}
console.log([...count]); // [3, 2, 1]
手动实现 next() 迭代器(更底层)
适用于需要精细控制每次调用行为的场景,比如惰性计算、异步迭代(需配合 Symbol.asyncIterator)或复用已有状态对象:
class Range {
constructor(from, to) {
this.from = from;
this.to = to;
}
[Symbol.iterator]() {
let current = this.from;
return {
next: () => {
if (current
<h3>注意 this 指向与闭包状态</h3>
<p>手动实现时,<code>next</code> 中的 <code>this</code> 指向的是返回的迭代器对象,不是原实例 —— 所以不能直接用 <code>this.from</code>。常见做法是把实例数据闭包进返回对象里(如上面例子中用 <code>let current</code>),或把状态存在迭代器对象自身上:</p>
<pre class="brush:php;toolbar:false;">[Symbol.iterator]() {
const iterator = {
current: this.from,
to: this.to,
next() {
if (this.current
<p>不复杂但容易忽略:每次调用 <code>[Symbol.iterator]()</code> 都应返回**新**的迭代器,确保多次遍历互不影响(比如两个 <code>for...of</code> 同时进行)。生成器函数天然满足这点;手动实现时切勿复用同一个迭代器对象。</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











