2017-11-10 111 views
1

目前我正在銳化我的ES6技能一點。我正在研究Iterator/Generator-syntax。我有Javascript ES6迭代器協議和forEach

class Library { 
 
    constructor(){ 
 
     this._books = []; 
 
    } 
 
    addBook(book){ 
 
     this._books.push(book); 
 
    } 
 
    get books() { 
 
     return this._books; 
 
    } 
 
    *[Symbol.iterator]() { 
 
     for(let i=0; i<this._books.length; i++) { 
 
      yield this._books[i]; 
 
     } 
 
    } 
 
} 
 

 
l = new Library(); 
 
l.addBook("Book1"); 
 
l.addBook("Book2"); 
 

 
for(let book of l){ 
 
    console.log(book); 
 
}

如果一切正常的工作示例。但我的第一種方法是嘗試類似

*[Symbol.iterator]() { 
    this._books.forEach(
     book => yield book 
    ) 
} 

這是(顯然)不正確。除了循環使用forwhile還有更簡潔的方法,寫這個嗎?

+0

WAG,但是如果Array實現迭代器模式,則可以(再次,WAG)'return _books.iterator()'。這就是我在C#中做的,當包裝實現IEnumerable的類型時。 – Will

+0

@Will WAG是什麼意思? – shash678

+4

@ shash678野驢猜測。 – Will

回答

3

我會用yield*做到這一點:

*[Symbol.iterator]() { 
     yield* this._books; 
    } 
+1

幾乎每次我看到您的帖子時,我都會學到一些東西。保持良好的工作! –

+0

Whoha。太好了!這就是我正在尋找的那種代碼。 –

2

我相信以下將是最習慣的方法。請參閱trincot的回答。

*[Symbol.iterator]() { 
    for(let book of this._books) { 
     yield book; 
    } 
} 
+0

好的!似乎是合法的。至少比我第一次嘗試的更好。 –

+1

trincot的回答比較好。 –

1

如果你硬是通過迭代器,你也可以做

[Symbol.iterator]() { 
    return this._books[Symbol.iterator](); 
} 

,並跳過需要發電機在第一地點。

+0

是的,你是對的。但重點更多的是用語言的語法和表現力來表達對某種方式起作用的感覺。我看到了Generator例子,開始四處遊蕩。不是代碼使得任何更大的「感覺」;-) –