Как создать итератор с помощью синтаксиса вычисляемых свойств и Symbol.iterator? - PullRequest
0 голосов
/ 28 марта 2019

Я недавно узнал о протоколе итератора , и есть вещь, которую я могу сразу понять.

Согласно примеру кода из того, что я читал о протоколе итератора 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 изменяется и этим новым итератором создается?

Означает ли это, что даже если конкретное имя для метода не определено, оно соответствует синтаксису благодаря синтаксису именования вычисляемых свойств ?

...