イテレータパターン:シーケンシャルアクセスのセット(シーケンシャルアクセスが発注される必要があります)。ユーザーはセット(パッケージ)の内部構造を知りません
< 本体> < DIV ID = "DIV1" > < P > jqueryの各</ P > < P > jqueryの各</ P > < P > jqueryの各</ P > </ DIV > < スクリプト> VAR ARR = [ 1 、2 、3 ]。 VAR nodelistと= document.getElementsByTagName(' P 'VAR $ P = $(' P ' ); //は三の横断書き込む必要三つの変数を横断する // 最初の (arr.forEach 関数{(項目) はconsole.log(項目); }) / / 第二 VAR Iは、長さ= nodeList.lengthは、 のためには、式(I = 0 、I < 長さ、I ++ ){ にconsole.log(nodelistと[I]); } // 第三 の$ p.each(関数(キー、P){ にconsole.log(キー、P); }) </ スクリプト> </ ボディ>
その後、我々はすべての3つのトラバーサルをサポートしている機能を書くことができ、これらの3つのデータ構造は同じではありませんが、それらはすべて一つの特徴は、彼らのような、このデータ構造のルックスの非常に認識していることである持っています
< 本体> < DIV ID = "DIV1" > < P > jqueryの各</ P > < P > jqueryの各</ P > < P > jqueryの各</ P > </ DIV > < スクリプト> VAR ARR = [ 1 、2 、3 ]。 VAR nodelistと= document.getElementsByTagName(' P 'VAR $ P = $(' P ' ); 関数各(データ){ VAR $ DATA = $(データ); // 生成イテレータ $ data.eachを(関数(キー、ヴァル){ にconsole.log(キー、ヴァル) }) } // 順次順序付きコレクションが横断 // のセットの内部構造を知っていない、この必要性を使用し 、それぞれの(ARR)を それぞれ(nodelistと); 各($ P); </ スクリプト> </ ボディ>
jQueryのは、オブジェクトに変換されます。
図クラスのUML
コード
クラスイテレータ{ コンストラクタ(容器){ この .LIST = container.list。 この .INDEX = 0 ; } 次の(){ 場合(この.hasNextは()){ 戻り 、この .LIST [ この .INDEX ++ ] } 戻り ヌル。 } のhasNext(){ 場合(この .INDEX> = この.list.length){ 戻り 偽 } 戻り 真。 } } クラスコンテナ{ コンストラクタ(リスト){ この.LIST = リスト。 } getIterator(){ 戻り 、新たなイテレータ(本) } } // 测试代码 VAR ARR = [1,2,3,4,5,6,7,8 ] せコンテナ = 新しいコンテナ(ARR)。 聞かせてイテレータ = container.getIterator(); 一方、(iterator.hasNext()){ にconsole.log(iterator.next()) }
シーン:ES6イテレータ
ES6イテレータが存在するのはなぜ?
イテレータパターンは、一般的にデザインパターンを使用しているので、そこにセットがたくさん持って注文し、ES6構文、データ型、確かに合理的ですが、あなたはまた、独自の多くを定義することができます。それらを統一するためのメカニズムが存在しなければなりません。
例えば、アレイ、地図、セット、文字列、TypedArray、引数、NodeListです。あなたはこれらを横断したい場合は、我々はすべてのデータ型(オブジェクトがコレクションを発注されていないことに注意してください)を反復処理する統一されたインタフェースを持っている必要があります
何ES6イテレータいますか?
上記のデータタイプは、反復子によって実現することができます。[Symbol.iterator]プロパティを持っています。属性値は、関数が、関数を実行する反復子を返しています。iteratorメソッドは、子要素の順序の次の反復を有することができます。テストの実行Array.prototypeを[Symbol.iterator]。
最初返す関数は、アレイは、このような性質を持っていることを示す、ソースコードを参照して、プロパティ値は関数であります
この関数はイテレータを返す実行します。
イテレータはリア済の隣に値があるかどうかを判定することにより、次の方法で、彼はないのhasNextがあります
コード
機能毎(データ){ // 生成遍历器 反復子が=せてデータを[Symbol.iterator](); アイテムを聞かせ = {行わ:偽}。 一方、(!item.done){ アイテム = iterator.next()。 もし(!{item.done) にconsole.log(item.value) } } } VAR ARR = [1,2,3,4,5,6 ] 各(ARR)。
Symbol.iterator誰もが誰もがそれぞれのメソッドをパッケージを必要としていることを知っている、そうするために、ために...文法であり...、データである[プロパティに対する歩行器、とオブジェクトのSymbol.iterator]は値を持っています。
機能毎(データ){ ため(データの項目を聞かせて){ にconsole.log(アイテム) } } VAR ARR = [1,2,3,4,5,6 ] 各(ARR)。
設計原理検証
イテレータとターゲットオブジェクトがオープン閉鎖原則に準拠して、反復子は、ユーザと対象物を分離し、分離しました