【发布时间】:2018-05-12 01:30:03
【问题描述】:
我试图过滤一个生成器,并期望这种通用功能必须在 JavaScript 中的任何地方定义,因为它是为数组定义的,但我找不到它。所以我试图定义它。但是我不能扩展内置的生成器。
我有一个示例生成器
function make_nums ()
{
let nums = {};
nums[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
return nums;
}
生成一些数字。
[...make_nums()] // => Array [ 1, 2, 3 ]
如果我构建一个数组,我可以使用数组的filter 函数来过滤数组。
[...make_nums()].filter(n => n > 1) // => Array [ 2, 3 ]
但我不想建立一个数组。相反,我想使用旧的生成器并构建一个新的过滤生成器。为此,我编写了以下函数。
function filtered (generator, filter)
{
let g = {};
g[Symbol.iterator] = function* () {
for (let value of generator)
if (filter(value))
yield value;
};
return g;
}
可以用来做我想做的事。
[...filtered (make_nums(), n => n > 1)] // => Array [ 2, 3 ]
但这是一个非常通用的函数,它可以应用于每个生成器,就像filter 函数可以应用于每个Array 一样。所以我尝试扩展生成器,但我不明白如何。
generators 的 MDN 文档以某种方式暗示 Generator.prototype 可能存在,但它似乎不存在。当我尝试在 Generator.prototype 中定义某些内容时,我得到了错误
ReferenceError: 生成器未定义
如何扩展内置的Generator 类?
【问题讨论】:
-
"但这是一个非常通用的函数" - 有什么问题?
-
既然可以扩展all iterators,为什么还要扩展
Generators?
标签: javascript ecmascript-6 generator