Я недавно узнал о протоколе итератора , и есть вещь, которую я могу сразу понять.
Согласно примеру кода из того, что я читал о протоколе итератора JavaScript, итерируемый объект создается следующим образом:
const iterable = {
[Symbol.iterator]() {
let step = 0;
const iterator = {
next() {
step++;
if (step === 1) {
return { value: 'This', done: false };
} else if (step === 2) {
return { value: 'is', done: false};
} else if (step === 3) {
return { value: 'iterable', done: false };
}
return { value: undefined, done: true };
}
};
return iterator;
}
};
var iterator = iterable[Symbol.iterator]();
iterator.next() // { value: 'This', done: false }
iterator.next() // { value: 'is', done: false }
iterator.next() // { value: 'iterable', done: false }
iterator.next() // { value: undefined, done: true }
В приведенном выше коде переменная iterator
получает итератор от объекта iterable
. Внутри iterable
определен метод с именем [Symbol.iterator]
, и как только пользователь пытается получить итератор от этого объекта, [Symbol.iterator]
возвращает объект, который содержит его замыкание (с next
методом, содержащим step
свободная переменная).
А вот и мой вопрос. вызов iterable[Symbol.iterator]()
каждый раз создает новый итератор. Я понимаю, что [Symbol.iterator]
действует как фабричный метод для итератор , я прав? Возможно ли это потому, что каждый раз, когда вызывается iterable[Symbol.iterator]()
, значение Symbol.iterator
изменяется и этим новым итератором создается?
Означает ли это, что даже если конкретное имя для метода не определено, оно соответствует синтаксису благодаря синтаксису именования вычисляемых свойств ?