如何扩展Generator类?

2024-03-18

我尝试过滤生成器,并期望这种通用功能必须在 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。所以我尝试总体上扩展生成器,但我不明白如何扩展。

MDN 文档发电机 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator以某种方式表明Generator.prototype可能存在,但又好像不存在。当我尝试定义某些东西时Generator.prototype,我收到错误

ReferenceError:生成器未定义

如何扩展内置Generator class?


传统的警告是,扩展内置原型不一定是最好的主意,而且需要谨慎行事,您可以使用以下命令获取生成器函数原型

const genproto = Object.getPrototypeOf(function*(){});

这样你就可以添加一个filter()能力:

Object.defineProperty(genproto, "filter", {
  value: function*(predicate) {
    for (let value of this())
      if (predicate(value)) yield value;
  }
});

因此:

console.log([... function*() {
    for (let i = 0; i < 10; i++) yield i;
  }.filter(value => value % 2 === 0)
]);

将打印[0, 2, 4, 6, 8].

需要明确的是:这个答案是关于扩展生成器的原型功能,而不是生成器对象本身。因此,这将确保程序中的每个生成器函数都可以使用.filter()方法和任何其他类似的扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何扩展Generator类? 的相关文章

随机推荐

  • Response.Redirect 在 Global.asax 中不起作用

    我创建了一个错误页面来显示所有未处理异常的一般消息 这是Global asax中的代码 HttpContext ctx HttpContext Current string e404 PAGE ctx Request AppRelative
  • 无法读取未定义的“xxx”属性

    我使用的是 Ionic 2 其中一个组件有两个组件 并且使用发射器共享数据 但是当我执行程序时 却出现了这个错误 未捕获的运行时错误 承诺中 TypeError 无法读取属性 未定义类型错误的 BillNo 无法读取属性 BillNo 在
  • 如何使用 git diff -G?

    我正在编写一个小测试套件 该套件运行要在一堆输入文件上进行测试的工具 对于每个输入文件 该工具都会创建相应的输出文件 两者都是 XML 格式 输入和输出文件在 Git 存储库上签入 输出文件带有工具编译时的时间 因此输出文件在被测试工具重新
  • 时间:2019-03-17 标签:c#winform

    我有一个学校项目 我需要创建一个 Windows 窗体应用程序 但就我而言 我需要创建一个控制台应用程序 现在我可以通过按钮从窗口打开控制台 以及一些我不完全理解的代码 但是是否可以在打开win窗体的同时打开控制台 2 控制台可以粘在win
  • Mysql 选择每次出现的 (n) 行[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 在文件中写入特殊字符

    我正在尝试将数据写入 eps 文件 这是我的代码 header Content Type text html charset utf 8 var echo var file test eps file put contents file v
  • 如何在 VS Code 中使用 Windows 内置的 OpenSSH ssh-agent,而不是 Git bash 的?

    我在 Windows 上运行 OpenSSH 使用自秋季 秋季创作者更新以来包含内置 OpenSSH https learn microsoft com en us windows server administration openssh
  • 迁移 NDB 模型属性的正确方法

    我目前在 NDB 中有一个模型 我想更改属性名称而不必接触 NBD 假设我有以下内容 from google appengine ext import ndb class User ndb Model company ndb KeyProp
  • Neo4j 索引创建失败

    我目前正在了解 Neo4j 和图形数据库的功能 我还做了neo4j附带的电影教程 现在我必须处理一个大型数据库 135 GB 500 个 mio nodes 950 个 mio relationships 并且想要为特殊类型的节点添加索引
  • 为什么 this 不能作为成员函数中的默认参数传递?

    我试图将当前的 le ngth 值作为默认参数作为函数参数传递 但编译器显示错误 在此上下文中不得使用 this 谁能告诉我我犯了什么错误 class A private int length public A void display i
  • 在node.js中,全局对象(或头对象)有名称吗?

    如果环境是浏览器 那么我们可以使用 测试this关键字指向window对象 也是全局对象 或者有些书称其为 头对象 如果在node js中 有没有类似这样的名字呢 window 以便 console log this globalObjec
  • 确定线斜率变化的位置(算法)

    如果你绘制下面的数字 你会得到一个 波动性微笑 数字遵循一个线性斜率 左斜率 然后更改为 遵循另一个线性斜率 右斜率 我有几组这样的数据 想知道斜率在哪里 变化 笔记 斜率变化通常发生在点之间 不知道有多少个点有左斜率 有多少个有 正确的斜
  • java 如何打开另一个目录中的文件?

    如何打开不在当前目录中但在另一个目录中的文件 例如 我有一个文件夹 F test 我的文件位于 F test test2 doit txt 和 D test3 doit2 txt 创建文件对象时在参数路径中输入的内容如下 File f ne
  • XSLT - 将前同级元素与当前节点元素进行比较

    我有这个 XML 文件
  • JavaFX 如何滚动 ScrollPane 以使节点位于视口中间?

    我必须创建显示当前时间的时间线 我正在使用 AnchorPane 并将添加的行放置在 ScrollPane 中 我需要模拟1天 滚动窗格宽度为 2880px 每60px为一小时 我的限制是 前一天 12 小时 第二天 12 小时 移动我的线
  • 如何为BackgroundService传递参数?

    我阅读了有关 ASP net core 2 2 的内容 并找到了有关通用主机的参考资料 我尝试在示例下使用 backgroundService 创建控制台应用程序 https github com aspnet AspNetCore Doc
  • 一个值在数组中存在多少次[重复]

    这个问题在这里已经有答案了 我想做的第一件事是找出我在输入中输入的数字是否存在于数组中 这有效 我想做的第二件事是找出它存在的次数 我在这里走的路正确吗
  • 如何将 Flot 与 AngularJS 集成?

    我对 Angular 和 Flot 很陌生 但对 Jquery 和 Javascript 很熟悉 我对如何将 Flot 图表绑定到 Angular 数据模型有点困惑 因为 Flot 是一个 JQuery 插件 我四处搜寻 但未能找到示例 我
  • 库存管理数据库设计

    我正在为我的公司创建一个内部网 我们希望在其中进行库存管理 我们销售和租赁报警系统 我们希望很好地了解哪些产品仍在我们的办公室中 哪些产品已出租或出售 何时出租或出售等 目前我想到了这个数据库设计 每次我们创建新合同时 该合同都与地点或商品
  • 如何扩展Generator类?

    我尝试过滤生成器 并期望这种通用功能必须在 JavaScript 中的任何位置定义 因为它是为数组定义的 但我找不到它 所以我试图定义它 但我无法扩展内置发电机 我有一个示例生成器 function make nums let nums n