修改生成器函数原型

TL; DR

我想修改一个生成器函数实例的原型 – 也就是从调用function*返回的对象。


假设我有一个生成器函数:

 function* thing(n){ while(--n>=0) yield n; } 

然后,我做一个实例:

 let four = thing(4); 

我想定义一个叫做exhaust的发电机原型,就像这样:

 four.exhaust(item => console.log(item)); 

这将产生:

 3 2 1 0 

我可以通过这样做来破解它:

 (function*(){})().constructor.prototype.exhaust = function(callback){ let ret = this.next(); while(!ret.done){ callback(ret.value); ret = this.next(); } } 

然而, (function*(){})().constructor.prototype.exhaust似乎非常…哈克。 没有GeneratorFunction的原型,我可以随时编辑…或者有吗? 有一个更好的方法吗?

没有GeneratorFunction的原型,我可以随时编辑…或者有吗?

不, GeneratorFunctionGenerator确实没有全局名称。

如果你想修改它们…不要。 扩展builtins是一个反模式。 编写一个静态辅助函数的实用程序模块。

(function*(){})().constructor.prototype看起来很… hacky。 有一个更好的方法吗?

我会推荐

 const Generator = Object.getPrototypeOf(function* () {}); const GeneratorFunction = Generator.constructor; 

那么你可以做

 Generator.prototype.exhaust = function(…) { … }; 

如果你真的需要。 但是要记住,如果你只是想扩展由function* thing创build的生成器,那么你也可以这样做

 thing.prototype.exhaust = …; 

这可能是一个更好的主意。