Un iterador es un objeto que puede acceder a las colecciones de datos en secuencia. Una de sus API típicas es el siguiente método. Este método obtiene el siguiente valor en la secuencia.
Ejemplo iterador
Tema: Espero escribir una función conveniente que pueda tomar cualquier cantidad de parámetros y crear un iterador para estos valores.
El código de prueba es bueno:
var it = valores (,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
Análisis: Dado que la función de valores debe recibir cualquier parámetros múltiples, necesitamos usar el método para construir una función con parámetros variables mencionados en la sección anterior. Luego, el objeto iterador dentro de los elementos del objeto de argumentos.
Código preliminar
valores de función () {var i =, n = arguments.length; return {HasNext: function () {return i <n;}, next: function () {if (this.hasNext ()) {return argumentos [i ++];} tirar un error nuevo ("Ha llegado a la final");}}}}}}Prueba con el código de prueba anterior
var it = valores (,,,,,,); it.next (); // undefinedit.next (); // undefinedit.next (); // undefinedit.next (); // undefined
Análisis de errores
El resultado de la ejecución del código no es correcto, por lo que el programa de codificación inicial se analizará a continuación.
valores de función () {var i =, n = arguments.length; // No hay error aquí, los argumentos son el objeto incorporado en valores return {HasNext: function () {return i <n;}, next: function () {if (this.hasNext () {return arguments [i ++]; // El error aparece aquí, argumentos es el objeto integrado de la función de método siguiente. } tirar un nuevo error ("Ha llegado al final");}}}El error de referencia aquí es muy similar a otro objeto inductor de dolor de cabeza. Al tratar con este punto, generalmente es usar variables y guardar esto correcto. Luego use esta variable en otro lugar. Luego, la solución al objeto de argumentos se libera, utilizando una variable para almacenarla, por lo que no hay problema con la referencia al objeto Argumentos.
Codificando de nuevo
valores de función () {var i =, n = arguments.length, arg = arguments; return {HasNext: function () {return i <n;}, next: function () {if (this.hasnext ()) {return arg [i ++];} throw throw ("ha llegado al final");}}}Ejecutar el código de prueba
var it = valores (,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
Los resultados son los mismos que se esperaban.
pista
Tenga cuidado con la jerarquía de anidación de funciones al referirse a los argumentos
Vincular una referencia explícitamente alcanzada a la variable de argumentos para que pueda referenciarla en una función anidada
Apéndice 1: Iterator
Los iteradores a veces se llaman cursores. Son patrones de diseño de software para programación, interfaces que se pueden atravesar en contenedores, y los diseñadores no necesitan preocuparse por el contenido de los contenedores.
Diagrama de clases de iterador UML
Implementación de Iterator JS
Tengo un poco de comprensión del modelo de diseño, pero en proyectos específicos, hay muchos de ellos que son modelos de fábrica, que rara vez se usan. La siguiente es una implementación simple. Hay algo mal. Bienvenido a comunicarse.
El código es el siguiente
function list () {this.data = [];} list.prototype = {add: function () {var args = []. slice.call (argumentos) this.data = this.data.concat (args); }, eliminar: function (i) {this.data.splice (i,);}, iterator: function () {return new iterator (this);}} function iterator (list) {this.list = list; this.cur =;}; iterator.prototype = {Hasnext: function () {return this.cur <this.list.data.length-;}, next: functer () {if (this.hasnext ()) {return this.list.data [this.cur ++];} tire nuevo error ('it ya está en ~');}, elimine: function () {this.list.remove (this.cur);}}} var owd = new List ();) it = list.iterator (); list.add (,,,,,,); it.next (); // it.next (); // it.next (); //Lo anterior es el método de usar variables para guardar los objetos de argumentos en JS introducidos a usted. ¡Espero que sea útil para todos!