修改生成器函数原型
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
的原型,我可以随时编辑…或者有吗?
不, GeneratorFunction和Generator确实没有全局名称。
如果你想修改它们…不要。 扩展builtins是一个反模式。 编写一个静态辅助函数的实用程序模块。
(function*(){})().constructor.prototype
看起来很… hacky。 有一个更好的方法吗?
我会推荐
const Generator = Object.getPrototypeOf(function* () {}); const GeneratorFunction = Generator.constructor;
那么你可以做
Generator.prototype.exhaust = function(…) { … };
如果你真的需要。 但是要记住,如果你只是想扩展由function* thing
创build的生成器,那么你也可以这样做
thing.prototype.exhaust = …;
这可能是一个更好的主意。