HuangHongRui / Notebook

:pencil2: Yeah.. This's My NoteBook...:closed_book:
0 stars 0 forks source link

Es6_Javascript中的类 [生成器方法] #25

Open HuangHongRui opened 7 years ago

HuangHongRui commented 7 years ago

在对象字面量中, 可以通过在方法名前面附加 ( * ) 的方式来定义生成器. 在中, 也是如此, 可以将任何方法定义成生成器..

HuangHongRui commented 7 years ago
class MyClass {
    *createIterator() {
        yield 1;
        yield 2;
        yield 3;
    }
}
let instance = new MyClass();
let iterator = instance.createIterator();

创建一个名为 MyClass 的类, 它有一个生成器方法createIterator()..返回值为一个硬编码在生成器中的迭代器.

HuangHongRui commented 7 years ago

如果使用类来表示值的集合..那为它定义一个默认迭代器会更有用.. 可通过 Symbol.iterator 定义生成器方法即可为类定义默认迭代器..

HuangHongRui commented 7 years ago
class Collection {
  constructor() {
    this.items = [ ]
  }
  *[Symbol.iterator]() {
    yield *this.items.values();
  }
}
var collection = new Collection()
collection.items.push(1);
collection.items.push(2);
collection.items.push(3);
for ( let x of collection.items ) {
  console.log( x );
}
// 1 // 2 // 3
HuangHongRui commented 7 years ago

这例子 用可计算名称 创建了一个代理 this.items 数组 value() 迭代器的生成器方法.. 任务管理一系列值的类 都应该引入 默认迭代器.. 因为一些与特定集合有关的操作 需要所操作的集合含有一个迭代器.. 现在可以将 Collection 的实例直接用于 for-of循环中或用展开运算符操作它.

如果不介意在对象的实例中出现添加的方法和访问器属性.. 则可以将它们添加到类的原型中.. 如果希望只出现在类中..那需要使用静态成员..