修改生成器函数原型

时间:2016-07-26 02:12:18

标签: javascript node.js ecmascript-6 generator

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其原型我可以轻松编辑......或者在那里?有更好的方法吗?

1 个答案:

答案 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 = …;

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