Итератор - это объект, который может получить доступ к коллекциям данных в последовательности. Одним из типичных API является следующий метод. Этот метод получает следующее значение в последовательности.
Пример итератора
Тема: Я надеюсь написать удобную функцию, которая может взять любое количество параметров и создать итератор для этих значений.
Тестовый код хорош:
var it = values (,,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
Анализ: Поскольку функция значений должна получать несколько параметров, нам необходимо использовать метод построения функции с переменными параметрами, упомянутыми в предыдущем разделе. Затем объект итератора внутри итерации над элементами объекта аргументов.
Предварительный код
function values () {var i =, n = arguments.length; return {hasnext: function () {return i <n;}, next: function () {if (this.hasnext ()) {return Arguments [i ++];} Выбросить новую ошибку ("она достигла конца");}}}}}}}}}}}}}}}Проверка с приведенным выше тестовым кодом
var it = values (,,,,,,); it.next (); // undefinedit.next (); // undefinedit.next (); // undefinedit.next (); // undefined
Анализ ошибок
Результат, работающего в коде, неверен, поэтому начальная программа кодирования будет проанализирована ниже.
function values () {var i =, n = arguments.length; // Здесь нет ошибки, аргументы-это встроенный объект в значениях return {hasnext: function () {return i <n;}, следующее: function () {if (this.hasnext ()) {возвращает аргументы [i ++]; // Ошибка появляется здесь, аргументы являются встроенным объектом. } бросить новую ошибку ("она достигла конца");}}}Справочная ошибка здесь очень похожа на другой объект, вызывающий головную боль. При работе с этим указанием обычно используется переменные и сохранять правильные это. Затем используйте эту переменную в другом месте. Затем выпускается решение объекта аргументов, используя переменную для его хранения, поэтому нет проблем со ссылкой на объект Arguments.
Кодируя снова
function values () {var i =, n = arguments.length, arg = arguments; return {hasnext: function () {return i <n;}, next: function () {if (this.hasnext ()) {return arg [i ++];} бросает новую ошибку («она достигла конца»);}}}}}}}}}}}}}}}}}}Запустите тестовый код
var it = values (,,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
Результаты такие же, как и ожидалось.
намекать
Остерегайтесь иерархии гнездования функции при ссылке на аргументы
Свяжите явную оценку ссылки на переменную аргументов, чтобы на нее можно было ссылаться в вложенной функции
Приложение 1: Итератор
Итераторов иногда называют курсорами. Они представляют собой шаблоны проектирования программного обеспечения для программирования, интерфейсов, которые можно пройти на контейнерах, и дизайнерам не нужно заботиться о содержании контейнеров.
Итераторная схема класса UML
Итератор JS реализация
У меня есть небольшое понимание модели дизайна, но в конкретных проектах есть много из них, которые являются заводскими моделями, которые редко используются. Ниже приведена простая реализация. Что -то не так. Добро пожаловать, чтобы общаться.
Код выглядит следующим образом
function list () {this.data = [];} list.prototype = {add: function () {var args = []. slice.call (аргументы) this.data = this.data.concat (args); }, remove: function (i) {this.data.splice (i,);}, iterator: function () {return new iterator (this);}} итератор функции (список) {this.list = list; this.cur =;}; iterator.prototype = {hasnext: funct this.cur <this.list.data.length-;}, Next: function () {if (this.hasnext ()) {return this.list.data [this.cur ++];} бросить новую ошибку ('это уже выше ~');}, rement: function () {this.list.remove (this.cur); it = list.iterator (); list.add (,,,,,,); it.next (); // it.next (); // it.next (); //Выше приведено метод использования переменных для сохранения объектов аргументов в JS, представленных вам. Я надеюсь, что это будет полезно для всех!