gpt4 book ai didi

javascript - 修改生成器函数原型(prototype)

转载 作者:数据小太阳 更新时间:2023-10-29 06:15:13 25 4
gpt4 key购买 nike

长话短说

我想修改生成器函数实例的原型(prototype)——即调用 function* 返回的对象。


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

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

然后,我创建一个实例:

let four = thing(4);

我想定义一个名为 exhaust 的生成器原型(prototype),如下所示:

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 看起来非常...... hacky。没有 GeneratorFunction 我可以轻松编辑其原型(prototype)的……或者有吗?有更好的方法吗?

最佳答案

There is no GeneratorFunction whose prototype I can readily edit... or is there?

不,GeneratorFunction and Generator确实没有全局名称。

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

(function*(){})().constructor.prototype seems very... hacky. Is there a better way to do this?

我会推荐

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

那么你可以做

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

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

thing.prototype.exhaust = …;

这可能是个更好的主意。

关于javascript - 修改生成器函数原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38580048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com