生成器就是通过构造函数Generator创造出来的对象,生成器既是一个迭代器,同时也是一个可迭代对象
基本语法:
function* myGenerator() {
yield 'one';
yield 'two';
return 'three';
}
var g = myGenerator();
g.next(); // { value: 'one', done: false }
g.next(); // { value: 'two', done: false }
g.next(); // { value: 'three', done: true }
g.next(); // { value: undefined, done: true }
分析Generator的执行过程:
注意:
function *creatrFeribo(){
let prop1 = 1;
let prop2 = 1;
let n = 1;
while(true){
if(n <= 2){
yield 1
}else{
const newValue = prop1 + prop2;
yield newValue;
prop2 = prop1;
prop1 = newValue;
}
n++;
}
}
const gen = creatrFeribo()
let obj = {
* Generator1(){
yield 1;
},
Generator2 : function* (){
yield 2;
}
}
Generator函数实例化对象是无法使用this的,可以通过call来实现:
function* Fun() {
this.a = 1;
yield this.b = 2;
yield this.c = 3;
}
var f = Fun.call(Fun.prototype);
f.next(); // Object {value: 2, done: false}
f.next(); // Object {value: 3, done: false}
f.next(); // Object {value: undefined, done: true}
f.a // 1
f.b // 2
f.c // 3
还可以将Generator函数调用方式改为构造函数:
function* gen() {
this.a = 1;
yield this.b = 2;
yield this.c = 3;
}
function Fun() {
return gen.call(gen.prototype);
}
var f = new Fun();
f.next(); // Object {value: 2, done: false}
f.next(); // Object {value: 3, done: false}
f.next(); // Object {value: undefined, done: true}
f.a // 1
f.b // 2
f.c // 3