2017-11-10 91 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例子,开始四处游荡。不是代码使得任何更大的“感觉”;-) –