有没有办法在使用 ES6 简写方法表示法的方法中使用词法 `this` ?

2023-11-29

关于SO的第一个问题,我希望我没有重复任何内容;我看过other 问题并认为我的不同足以值得询问。

基本上,有没有办法让this它位于使用速记符号编写的方法的方法主体中,或者是词法的,或者是绑定到特定值的?

这样做的动机来自于我在实现时想要使用 ES6 方法简写迭代器协议,其中@@iterator方法在调用时返回一个迭代器对象。该迭代器对象必须有一个next()方法,当调用它本身时返回另一个对象。在第二个对象中,我想要引用原始对象(在我的例子中,Graph) 实例。

请注意,在下面的代码片段中,它确实not按预期工作,因为this捆绑,next()正在使用ES6 方法定义简写.

class Graph {
  constructor(initialNodes) {
    this.data = [...initialNodes];
  }

  [Symbol.iterator]() {
    let nextIndex = 0;
    // `this` binding is fine here, as expected
    return {
      // look at that beautiful shorthand
      next() {
        return nextIndex < this.data.length
          // `this` binding is not fine here
          ? { done: false, value: this.data[nextIndex++] }
          : { done: true };
      }
    };
  }
}

我知道在对象返回上方定义函数,然后将该函数分配为要返回的对象的属性,但我再次想知道是否可以使用方法简写语法。

定义next()将返回对象作为常规函数放在上面,然后将其绑定到对象属性赋值中:

class Graph {
  // constructor

  [Symbol.iterator]() {
    let nextIndex = 0;
    // I know you can do this
    const next = function() {
      return nextIndex < this.data.length
        ? { done: false, value: this.data[nextIndex++] }
        : { done: true };
    };
    return {
      next: next.bind(this)
    };
  }
}

定义next()在返回对象上方作为箭头函数意味着不需要bind,但仍然没有方法语法简写:

class Graph {
  // constructor

  [Symbol.iterator]() {
    let nextIndex = 0;
    // I know you can also do this
    const next = () => {
      return nextIndex < this.data.length
        ? { done: false, value: this.data[nextIndex++] }
        : { done: true };
    };
    return {
      next
    };
  }
}

冰泡菜在评论中提出了一个很好的观点,我可以使用 storethiscontext 并在速记方法主体中引用它。我假设这是我能得到的最接近的结果?

class Graph {
  // constructor

  [Symbol.iterator]() {
    let nextIndex = 0;
    const self = this;
    return {
      next() {
        return nextIndex < self.data.length
          ? { done: false, value: self.data[nextIndex++] }
          : { done: true };
      }
    };
  }
}

解决您的问题的理想解决方案是使用适当的工具来完成工作:生成器函数。它们也可以与简写语法,并且它们将正确绑定this.

生成器函数返回符合以下条件的对象迭代器协议,并且可以使用yield*将迭代器的输出委托给另一个可迭代对象(如数组)。

class Graph {
  constructor(initialNodes) {
    this.data = [...initialNodes];
  }

  * [Symbol.iterator]() {
    yield* this.data;
  }
}

const graph = new Graph([1, 2, 3]);
for (const node of graph) {
  console.log(node);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在使用 ES6 简写方法表示法的方法中使用词法 `this` ? 的相关文章

随机推荐

  • 关于mvc:intercepter,如何设置排除路径

    众所周知 我们可以这样配置拦截器
  • 更改android复选框的大小

    在我的 Android 应用程序中 我需要更改 Android 复选框的大小 我搜索并了解到它不能通过简单地更改属性来完成 我找到了这个链接但无法真正弄清楚到底需要做什么 找不到此链接 android sdk windows 1 0 r2
  • 使用主动/被动冗余模型的应用程序应如何使用 Kubernetes 进行容器化?

    我有一个在虚拟机上运行的分布式应用程序 其中有一个以主动 被动模式运行的服务 主用虚拟机通过公网IP提供服务 如果主动虚拟机发生故障 公共 IP 将移至被动虚拟机 被动虚拟机将变为主动虚拟机并开始提供服务 这种模式如何适合 kubernet
  • 在网页中显示 PDF

    我正在使用 Spring MVC 我想将 PDF 文件从本地显示到网页 我不知道我应该对我的控制器做什么来做到这一点 我看到一些类似的问题 其答案返回ResponseEntity
  • R:对 2 个数据帧的行进行 t 测试

    我有两个数据框 我想对行进行独立的 2 组 t 检验 即t test y1 y2 where y1是 dataframe1 中的一行并且y2与数据帧2中的匹配行 实现这一目标的最佳方法是什么 编辑 我刚刚找到了格式 dataframe1 i
  • 如何隐藏iOS状态下录音时的红条?

    我使用AVAudioRecorder来录制语音 我发现有时当我分配它并开始录音时 状态栏下会出现一个红色条 就像您在后台调用时的红色条 如何隐藏它 你不能那样做 每个应用程序 包括内置的语音备忘录应用程序 在使用麦克风时都会有该栏
  • 通过 JAXB 解组读取自定义 XML 处理指令

    通过 JAXB 解组时有没有办法读取自定义 xml 处理指令 例子
  • 更快的 UIImage - Base64 转换

    我正在做的工作必须在之间进行编码和解码UIImage和 Base 64 字符串 这对于较小的图像非常有效 向前和向后转换只需不到 1 秒 但当我将其应用于较大的图像时 需要很长时间 几乎一分钟 有没有其他方法来编码和解码UIImage对象字
  • 调用 ffmpeg.c 的 main 两次导致应用程序崩溃

    使用 FFmpeg 4 0 2 并调用它ffmpeg c s main函数两次导致 Android 应用程序崩溃 使用 FFmpeg 共享库和 JNI A libc Fatal signal 11 SIGSEGV code 1 fault
  • 使用通用参数作为端口数组长度

    我想做的事 entity FIRfilter is generic NTAPS integer port h in array 0 to NTAPS 1 of std logic vector 15 downto 0 end FIRfitl
  • 基于数据库数组PHP自动检查复选框

    在我的页面的 用户设置 选项卡中 我希望用户确定特定用户发布的帖子类型 表格如下
  • Spark独立模式和本地模式有什么区别?

    Spark独立模式和本地模式有什么区别 Spark Standalone是一个可以在集群上工作的资源管理器 它只是内置的资源管理器 而不是像纱线这样的外部资源管理器 Spark本地运行无需任何资源管理器 一切都在单个jvm中运行 您可以决定
  • Java 同步方法...不同步

    对于我当前的 java 练习 我必须从 2 个不同的 Gmail 帐户获取邮件 我通过创建 Gmail 类的新实例来完成此操作 gmail 类扩展了线程 其中有一个同步方法 readMail 用于获取邮件并打印它 这个 readMail 方
  • 使用 NLog 将记录器名称写入 Excel 文件

    感谢 Rolf 在这个问题中的评论 NLog 在 C 中具有严重性和类别 我能够将日志消息的类别 例如 热 或 数据库 或 机械 记录到文本文件中 我只需将名称传递给 GetLogger 方法即可完成此操作 public MainWindo
  • Mongoimport 带有字符串 _id 和 upsert 的 csv 文件

    我正在尝试使用 mongoimport 来更新插入 id 中带有字符串值的数据 由于 id 看起来像整数 即使它们在引号中 因此 mongoimport 将它们视为整数并创建新记录 而不是更新插入现有记录 我正在运行的命令 mongoimp
  • Android GPU 分析 - OpenGL 动态壁纸速度很慢

    我正在使用 OpenGL ES 3 0 开发动态壁纸 我已经根据优秀教程进行了设置http www learnopengles com how to use opengl es 2 in an android live wallpaper
  • 如何在 NestJS 中处理 RpcException

    我正在尝试构建一个包含多个微服务的 NestJS 后端和一个作为与微服务通信的网关的 REST API 对于网关和微服务之间的通信 我使用 gRPC 简单的通信已经可以工作 但现在我想在微服务中实现错误处理 NestJS 文档指出 这可以通
  • RecyclerView 查看项目

    我想在 RecyclerView 中显示 2 列 但它们显示在 1 列中 如下图所示 如何在两列中显示我的视图 我在我的代码中尝试了两列 rcv pro setLayoutManager new GridLayoutManager this
  • 如何在无需用户交互且仅通过客户端 ID 和密码的情况下验证我的 Quickbook Intuit api 访问?

    我正在开发一个项目 其中后台 crons 创建发票 我想将它们添加到我在后端创建的 Quickbook 帐户中 所以问题是我想仅使用客户端 ID 和秘密参与来访问 api 如何在无需用户交互且仅通过客户端 ID 和密码的情况下验证我的 Qu
  • 有没有办法在使用 ES6 简写方法表示法的方法中使用词法 `this` ?

    关于SO的第一个问题 我希望我没有重复任何内容 我看过other 问题并认为我的不同足以值得询问 基本上 有没有办法让this它位于使用速记符号编写的方法的方法主体中 或者是词法的 或者是绑定到特定值的 这样做的动机来自于我在实现时想要使用