Есть 2 итерируемых объекта: строка и кастомный. В кастомном сначала вызывается метод iter(), а затем несколько раз вызывается метод next(). в результате выводятся все элементы кастомного итерируемого объекта:
class Obj {
constructor(word) {
this.word = word;
}
iter() { return new Iterator(this.word); }
}
class Iterator {
constructor(word) {
this.word = word;
this.index = 0;
}
next() {
try {
let letter = this.word[this.index];
this.index += 1;
return letter;
} catch (err) {
throw "StopIteration";
}
}
iter() { return this; }
}
const obj = new Obj('sergey');
it = obj.iter();
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
Скажите, прав ли я в том, что в случае не кастомного итерируемого объекта (строки) происходит такая же последовательность операций, но неявно. То есть строка, попадая в контекст цикла
for of
при помощи метода iter() (название может отличаться, не в этом суть) возвращает итератор. И затем цикл при каждом проходе неявно пинает метод next(). В результате выводятся все элементы итерируемого объекта:
const s = 'sergey';
for (let char of s) {
console.log(char);
}
При этом строка имеет метод iter() (название может отличаться) от родительского объекта.