たびたびお世話になります。
よろしくお願いします。
本日、イテレータの学習中に分からない箇所が数カ所あり、質問させていただきたく投稿させていただきました。
書籍に以下のコードが掲載されています。
JavaScript
1class Log{ 2 constructor(){ 3 this.messages = []; 4 } 5 add(message){ 6 const now = Date.now(); 7 console.log(`ログ追加:${message}(${now})`); 8 this.messages.push({message, timestamp: now}); //①この({…})内のmessage 9 } 10 [Symbol.iterator](){ //③ここの[Symbol.iterator]()の定義 11 let i = 0; 12 const messages = this.messages; 13 return { 14 next: () => i >= messages.length ? //②ここのnext 15 {value: undefined, done: true} : {value: messages[i++], done: false} 16 } 17 } 18}
質問は以下のとおりです。
① push()メソッドの引数が({message, timestamp: now})となっています。
今まで{}内はオブジェクトになるように思っていました。
しかしながら、ここには書いていませんが、この後段にあるLogクラスのインスタンス(new Log)ではlog.add(‘クジラを見た’)となっていて、オブジェクトではありません。
{}内は必ずしもオブジェクトにならないかもしれませんが、ではこの{message,…}は何かということを疑問に思いました。
サイト等で調べると、「分割代入」というものを見つけましたが、この場合は違うような気がしました。
このmessageが何か分かりますでしょうか?
② ここのreturn {next:…} の部分ですが、
Symbol.iterator関数内でreturn {next:…}を返し、next()メソッドの値を定義、または上書きしているのでしょうか?
メソッドの値はこういう形で定義、または上書きできるものでしょうか。
③ このSymbol.iteratorのメソッドの定義はなぜ必要なのでしょうか。
イテラブルなものはSymbol.iteratorのメソッドを元から持っているので、Symbol.iteratorのメソッドの定義は必要ないように思います。
messagesに対するSymbol.iteratorとして設定するためでしょうか?
また同じ書籍に次のコードが掲載されています。
JavaScript
1class FibonacciSequence { 2 [Symbol.iterator](){ 3 let a = 0, b = 1; 4 return { 5 next() { //このnext 6 let rval = {value: b, done: false}; 7 b += a; 8 a = rval.value; 9 return rval; 10 } 11 }; 12 } 13 }
というものがあります。
上の②の質問に関する質問になりますが、
コード中のnext()は、
Class FibonacciSequenceがSymbol.iteratorによってイテレータ化したものは、next()のメソッドを持つので、その値の定義、もしくは上書きしていると考えていいですか?
だとすると、上の質問②とは違う形でnext()のメソッドを設定しています。
この②と④の違いはどのように考えればいいのでしょうか?
質問がてんこもりになってしまい申し訳ありません。
わかるものだけでけっこうですので、どなたか知見をお持ちの方回答よろしくお願いします。
(参考書籍「初めてのJavaScript」第3版 オライリー・ジャパン P201~203)
回答3件
あなたの回答
tips
プレビュー