Um iterador é um objeto que pode acessar coleções de dados em sequência. Uma de suas APIs típicas é o próximo método. Este método obtém o próximo valor na sequência.
Exemplo de iterador
Tópico: Espero escrever uma função conveniente que possa levar qualquer número de parâmetros e criar um iterador para esses valores.
O código de teste é bom:
var it = valores (,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
Análise: Como a função dos valores precisa receber qualquer parâmetros múltiplos, precisamos usar o método de criar uma função com parâmetros variáveis mencionados na seção anterior. Em seguida, o objeto iterador dentro dos itera sobre os elementos do objeto argumentos.
Código preliminar
Valores da função () {var i =, n = argumentos.length; return {hasNext: function () {return i <n;}, próximo: function () {if (this.hasnext ()) {retorna argumentos [i ++];} lançar um novo erro ("atingiu o final");}}}Teste com o código de teste acima
var it = valores (,,,,,); it.next (); // undefinedit.next (); // undefinedit.next (); // undefinedit.next (); // indefinido
Análise de erros
O resultado do código em execução não está correto, portanto, o programa de codificação inicial será analisado abaixo.
Função valores () {var i =, n = argumentos.length; // Não há erro aqui, os argumentos são o objeto interno em valores retornar {hasNext: function () {return i <n;}, next: function () {if (this drock ()) {return argument [i ++]; // o erro pareça aqui. } lançar um novo erro ("Ele chegou ao fim");}}}O erro de referência aqui é muito semelhante a outro objeto indutor de dor de cabeça. Ao lidar com isso apontando, geralmente é usar variáveis e salvar o correto. Em seguida, use essa variável em outro lugar. Em seguida, a solução para o objeto de argumentos é liberada, usando uma variável para armazená -lo, para que não haja problema com a referência ao objeto Argumentos.
Codificando novamente
Valores da função () {var i =, n = argumentos.Length, arg = argumentos; return {hasNext: function () {return i <n;}, next: function () {if (this.hasnext ()) {return arg [i ++];} lança um novo erro ("alcançou o final");}}}}Execute o código de teste
var it = valores (,,,,,); it.next (); // it.next (); // it.next (); // it.next (); //
Os resultados são os mesmos que o esperado.
dica
Cuidado com a hierarquia de nidificação de funções ao se referir a argumentos
Vincular uma referência explicitamente escopo à variável de argumentos para que ela possa ser referenciada em uma função aninhada
Apêndice 1: Iterador
Às vezes, os iteradores são chamados de cursores. São padrões de design de software para programação, interfaces que podem ser percorridas em contêineres e os designers não precisam se preocupar com o conteúdo dos contêineres.
Diagrama de classe UML ITERATOR
Implementação do Iterador JS
Eu tenho um pouco de entendimento do modelo de design, mas em projetos específicos, existem muitos deles que são modelos de fábrica, que raramente são usados. A seguir, é uma implementação simples. Há algo errado. Bem -vindo a se comunicar.
O código é o seguinte
Função List () {this.data = [];} list.prototype = {add: function () {var args = []. slice.call (argumentos) this.data = this.data.concat (args); }, remova: function (i) {this.data.splice (i,);}, iterator: function () {return new iterator (this);}}} function iterator (list) {this.list = list; this.cur =;}; iTerator.protype = {hasnext: function () {{; this.cur <this.list.data.length-;}, próximo: function () {if (this.hasnext ()) {return this.list.data [this.cur ++];} throw Error ('já está sobre ~');}, remover: function {this.List.Remove (this.c (this.C); it = list.iterator (); list.add (,,,,,); it.next (); // it.next (); // it.next (); //O exposto acima é o método de usar variáveis para salvar objetos de argumentos no JS apresentado a você. Espero que seja útil para todos!