我想修改生成器函数实例的原型 - 即调用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
其原型我可以轻松编辑......或者在那里?有更好的方法吗?
答案 0 :(得分:4)
没有
GeneratorFunction
其原型我可以轻松编辑......还是在那里?
不,GeneratorFunction and Generator确实没有全球名称。
如果你想修改它们......不要。扩展内置函数是一种反模式。编写静态辅助函数的实用程序模块。
(function*(){})().constructor.prototype
似乎非常......哈哈。有更好的方法吗?
我会推荐
const Generator = Object.getPrototypeOf(function* () {});
const GeneratorFunction = Generator.constructor;
然后你可以做
Generator.prototype.exhaust = function(…) { … };
如果你真的需要。但请记住,如果您只想扩展function* thing
创建的生成器,那么您也可以
thing.prototype.exhaust = …;
这可能是一个更好的主意。