Чтобы сделать пользовательский объект совместимым с циклами for...of, нужно реализовать протокол итерируемости, определив метод [Symbol.iterator]() на объекте.
Метод [Symbol.iterator]() должен возвращать объект-итератор — объект с методом next(). Каждый вызов next() должен возвращать объект в одной из этих двух форм:
{ value: <current>, done: false } — пока значения остаются{ done: true } — когда итерация завершенаconst range = {
from: 1,
to: 5,
[Symbol.iterator]() {
let current = this.from;
const last = this.to;
return {
next() {
return current <= last
? { value: current++, done: false }
: { done: true };
}
};
}
};
for (const num of range) console.log(num); // 1, 2, 3, 4, 5
[Symbol.iterator]()next()for...of, оператор spread (...) и Array.from(), автоматически опираются на этот протоколРеализация протокола итерируемости требует двух вещей:
[Symbol.iterator]()next(), которая управляет состоянием итерацииОбъект становится итерируемым, если ты определишь метод [Symbol.iterator](), который возвращает объект-итератор с методом next().
Новый — ещё не проверен сообществом
Вы