Javascript итераторы не работают - PullRequest
0 голосов
/ 12 октября 2018
class List{
  constructor(){
    this.data = [1,2,3];
  }

  [Symbol.iterator](){
    return this.data;
  }

}


let list = new List();
for(let i of list)
  console.log(i);

Ошибка в строке for ():

Uncaught TypeError: undefined is not a function

Так что невозможно использовать итератор с нашими собственными классами, как в PHP?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы можете сделать свойство [Symbol.iterator] вашего объекта объектом генератора, а не функции, и просто выдавать элементы списка индивидуально с помощью *:

class List {
  constructor() {
    this.data = [1, 2, 3];
  }

  *[Symbol.iterator]() {
    yield* this.data;
  }

}

let list = new List();
for (let i of list) {
  console.log(i);
}
0 голосов
/ 12 октября 2018

Это не работает, потому что вы неправильно реализовали итерируемый протокол.Чтобы объект был итерируемым, он должен иметь ключ @@iterator (который у вас есть), , который возвращает итератор , который вам не хватает (массивы являются итераторами, но не итераторами).

Однако, поскольку массив является итеративным, вы можете использовать его свойство @@iterator, чтобы получить итеративное для него.Тогда вы можете вернуть это.

class List{
  constructor(){
    this.data = [1,2,3];
  }

  [Symbol.iterator](){
    return this.data[Symbol.iterator]();
  }

}


let list = new List();
for(let i of list)
  console.log(i);

Подробнее о протоколе итерации / итератора Javascript можно прочитать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...