function* g() {}; g.prototype.hello = function () { return 'Hi'; } let obj = g(); console.log(obj instanceof g);//true console.log(obj.hello());//Hi
obj是g的实例,而且继承了g.prototype。但是,如果把g当做普通函数,不生效,因为g返回遍历器对象,不返回this对象。
function* g() { this.a = 11; }; let obj = g(); console.log(obj.a);//undefined
function* F() { yield this.x = 2; yield this.y = 3; }; new F();//F is not a constructor
/*通过一种方法,是Genertor函数具有this值功能*/ function * F(){ this.a = 1; yield this.b = 2; yield this.c = 3; } var it = F(); var obj = {}; var f = F.call(obj);//把obj当做参数,来调用F()的方法。 console.log(f) console.log(it.next());//{value:2, done:false} console.log(it.next());//{value:3, done:false} console.log(it.next());//{value:undefined, done:true} console.log(f.next());//{value:2, done:false} console.log(f.next());//{value:3, done:false} console.log(f.next());//{value:undefined, done:true} console.log(it.a);//undefined 因为generator函数总是返回一个遍历器对象 console.log(obj.a);//1 console.log(obj.b);//2 console.log(obj.c);//3 可以正常获取
/*解决上面的函数不统一问题*/ // var f = F.call(F.prototype);//将obj换成F.prototype //此时能使用f.next()直接取到 每一步骤的值 //也可以使用f.a获取属性值
/*再将F改造成构造函数,就可以使用new命令了*/ function* gen() { this.a =1; yield this.b = 2; yield this.c = 3; } function F() { return gen.call(gen.prototype);//这句话 等同于 F.call(F.prototype),只不过现在当做一条返回值,装在了构造函数里 //让构造函数F成立,下面才能用到new。 //不要被函数的外表所迷惑,重要的是函数传递逻辑。 } var f = new F(); console.log(f.next()); console.log(f.next()); console.log(f.next()); console.log(f.a); console.log(f.b); console.log(f.c);