Pull to refresh

Comments 7

Еще три копейки про итераторы:


  1. Там не только next(), но еще методы return() и throw(), в которых кроется весь «дьявол в деталях», когда идет речь про досрочное прерывание итерации, например.
  2. В конце из next() возвращается не просто { done: true }, а { done: true, value: xyz } где xyz — это то, что генератор вернул через оператор return. И это значение xyz не учитывается при, например, проходе по for-of, spread и т.д. Также next() возвращает этот самый xyz только один раз, дальше будет undefined.
  3. В статье зачем-то созданный итератор присваивается в this.iterator, не надо так делать.
Добрый день!
Благодарю за полезный комментарий)
Статью поправил

Вначале не поверил пункту 2. Однако:


function * gen(){ yield 1; yield 2; return 3; };
iter = gen();
[...iter]; // [1,2]

всё так

«for… of» и "..." перегрузили, 2ality.com/2011/12/fake-operator-overloading.html, а вот еще одна старая статья про ограниченные возможности перегрузки других операторов.

Не то чтобы те методы совсем хороши, но дают возможности для
var p = new Point();
p._ = new Point(1, 2) + new Point(3, 4) + new Point(5, 6);
p._ = new Point(1, 2) * new Point(3, 4) * new Point(5, 6);
Прошу прощения, но причем тут перегрузка? For of это отличный пример полиморфизма, а не перегрузки. В каком месте for of перегружается? For of конструкция работает только с итерируемыми объектами.
Может я немного не точен в определениях, с института много времени прошло. Просто прочитав статью первым делом написал небольшой кусочек когда меняющий поведение Array.prototype[Symbol.iterator], так чтобы при использовании спреда получить массив длинной в десять со случайными элементами.

Ваш пример конечно явный полиморфизм, но мне была интересна возможность использования именно перегрузки, поскольку это повышает гибкость, учитывая весьма ограниченные методы работы с массивами в js, было весьма полезно)
Добрый день!)
Спасибо за ваш комментарий!
Array.prototype[Symbol.iterator] действительно переписывает существующую в Array.prototype реализацию итератора, но в статье мы так не делаем =)

В данной статье я хотел показать как мы можем написать свою сущность которая реализует Symbol.iterator, так же как javascript в Array.prototype, String.prototype и так далее
+ показать как использовать конструкции языка для взаимодействия с нашей сущностью.

Как заметил limitofzero, это действительно хороший пример полиморфизма)

Sign up to leave a comment.

Articles