generator的一些语法

141 阅读1分钟
  1. 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 }
  1. 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
  1. 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