- Generator.prototype.return() :Generator 函数返回的遍历器对象,还有一个return方法,可以返回给定的值,并且终结遍历 Generator 函数。
function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen();
g.next() // { value: 1, done: false }
g.return('foo') // { value: "foo", done: true }
g.next() // { value: undefined, done: true }
复制代码
- Generator.prototype.throw():Generator 函数返回的遍历器对象,都有一个throw方法,可以在函数体外抛出错误,然后在 Generator 函数体内捕获。
var g = function* () {
try {
yield;
} catch (e) {
console.log('内部捕获', e);
}
};
var i = g();
i.next();
try {
i.throw('a');
i.throw('b');
} catch (e) {
console.log('外部捕获', e);
}
// 内部捕获 a
// 外部捕获 b
复制代码
- generator函数的this generator函数总是返回一个遍历器,利es6规定这个遍历器是generator函数的实例,也继承了该函数的原型对象上的方法。
function* g() {}
g.prototype.hello = function () {
return 'hi!';
};
let obj = g();
obj instanceof g // true 说明object是g的实例
obj.hello() // 'hi!'
复制代码
但是g返回的是遍历器对象,而不是this对象,例如下:
function* g() {
this.a = 11;
}
let obj = g();
obj.a // undefined 不能返回this
复制代码
不是纯粹的构造函数,不能用new命令来跟构造函数一起使用。既想用next又想使用this,变通方法如下:
function* F() {
this.a = 1;
yield this.b = 2;
yield this.c = 3;
}
var obj = {};
var f = F.call(obj);
//执行过程中,一步步将属性绑定在obj上
f.next(); // Object {value: 2, done: false}
f.next(); // Object {value: 3, done: false}
f.next(); // Object {value: undefined, done: true}
obj.a // 1
obj.b // 2
obj.c // 3
复制代码
但是上面代码执行的是f(遍历器),生成的是实例obj,为了实现这两个对象统一。将obj换成F.prototype
function* F() {
this.a = 1;
yield this.b = 2;
yield this.c = 3;
}
var f = F.call(F.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
复制代码