为什么我的 ES6(使用 Babel)类在实例方法中显示“this”未定义?

2023-12-26

我正在使用 Hapi.JS 在 Node 中构建一个应用程序。

我有一个身份验证插件类,它给我带来了各种各样的问题。当我尝试引用时this从类的方法中,我收到一条错误消息this未定义。为什么会发生这种情况?

摘录:

class OAuth {

  constructor () {}

  register (server, err, next) {
    this.server = server;
    this.registerRoutes();
  }

  registerRoutes () {
    console.log(this.server.route);
    this.server.route([
      {
          method: 'POST',
          path: '/oauth/token',
          config: {
              auth: false,
              handler: function(request,reply){
                console.log("test");
                reply("test");
              }
            }
      },
      {
        method: 'GET',
        path: '/test',
        config: {
          auth: false,
          handler: function(request,reply){
            console.log("test");
            reply("test");
          }
        }
      }
    ]);
  }
}
module.exports = new OAuth();

在其他地方,这被称为:

const oauth = require('./oauth');
oauth.register(server);

每次调用寄存器函数时,我都会收到此错误:

TypeError: Cannot set property 'server' of undefined

为什么我的实例无法正常工作?


带有 babel 的 ES6 类不会自动绑定this为你。这是一个常见的误解,因为class被介绍了。有多种方法可以解决它。

  1. 使用ES7。 Babel 有一个实验(截至本文)类属性 https://babeljs.io/docs/plugins/transform-class-properties/插入。

    class OAuth {
      constructor () {}
    
      register = (server, err, next) => {
        this.server = server
        this.registerRoutes()
      }
    
      registerRoutes = () => {}
    }  
    

这是如何运作的?当您将箭头函数与类属性插件一起使用时,它会转换为类似以下内容,并按照您使用时的预期进行绑定class syntax.

var OAuth = function OAuth() {
  var _this = this;

  _classCallCheck(this, OAuth);

  this.register = function (server, err, next) {
    _this.server = server;
    _this.registerRoutes();
  };

  this.registerRoutes = function () {};
}
  1. 在构造函数中绑定类属性

    class OAuth {
      constructor () {
        // `this` is the OAuth instance in the constructor
        this.register = this.register.bind(this)
        this.registerRoutes = this.registerRoutes.bind(this)
      }
    
      register (server, err, next) {
        // `this` is the global object.. NOT! 
        // after binding in the constructor, it's the OAuth instance ^_^
        // provided you use `new` to initialize your instance
        this.server = server
        this.registerRoutes()
      }
    
      registerRoutes () {}
    }
    
  2. Use createClass来自 React,它会为你进行绑定。请注意,我们仅使用 React 来实现其类属性绑定魔法。我们不是在创建反应组件。

    import React from 'react'
    
    const OAuth = React.createClass({
      register (server, err, next) {
        this.server = server
        this.registerRoutes()
      }
    
      registerRoutes () {}
    })
    
  3. 仅供使用autoBind from 反应类 https://www.npmjs.com/package/react-class。这里我们使用 ES6+ 类语法制作一个 React 组件,只是为了使用autoBind方法。我们不必使用componentWillMount, render等,这些都带有react组件。

    import { autoBind } from 'react-class'
    
    class OAuth extends React.Component {
      constructor(props) {
        super(props)
        autoBind(this)
      }
    
      register (server, err, next) {
        this.server = server
        this.registerRoutes()
      }
    
      registerRoutes () {}
    }
    
  4. 滚动你自己的类属性活页夹。这是一个很好的练习,基本上与选项 2 相同,可能代码也更少。

    // call it in your constructor
    bindStuff(this, ['register', 'registerRoutes', 'etc'])
    
    // define it somewhere as
    function bindStuff (context, props) {
      props.forEach(prop => {
        context[prop] = context[prop].bind(context);
      })
    }
    
  5. 如果您确实想创建反应组件,您可以结合箭头函数和属性初始值设定项来执行类似的操作

    class OAuthComponent extends React.Component {
      whateverMethodYouWant = (event) => {
        this.setState({somePropertyYouCareAbout: true}) // this is bound
      }
    
      anotherMethod = () => {
        this.whateverMethodYouWant() // this is bound
      }
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 ES6(使用 Babel)类在实例方法中显示“this”未定义? 的相关文章

随机推荐

  • 无法使用 npm 重建依赖关系

    当我尝试将本地运行良好的 NodeJS 应用程序推送到 Heroku 时 以下是我在终端中得到的内容 dcaclab ubuntu RubymineProjects nodejs consumer git push heroku maste
  • 为什么不注入 IServiceProvider 而不是每个单独的依赖项?

    我想知道为什么不显式使用 IServiceProvider 来解决依赖项而不是单独注入每个依赖项 换句话说 为什么要使用这种方法 public class A private B b private C c private D d priv
  • 使用 CLI 或任何其他方式将 C++ 库静态链接到 C# 进程

    是否可以采用用 C 编写的静态库 并以某种方式将其集成到 NET 进程中 从而将 NET 进程与 lib 集成到一个 exe 文件中 我的意思是 我知道我可以从 C 进程中调用 C DLL 但用户仍然必须拥有 C DLL 但是否可以使用 l
  • 使复选框绑定到可为 null 的 bool 转换,从 null 到 true

    我有一个复选框及其IsChecked属性绑定到可为 null 的布尔值 当我的控件首次加载时 该值为空 并且该复选框显示为灰色 这就是我要的 当用户单击该复选框时 它会转为 false 未选中状态 然而 99 的情况下 用户会想要勾选该复选
  • Julia UndefVarError:未定义子类型

    不清楚为什么我得到ERROR LoadError UndefVarError subtypes not defined执行 jl 文件时 但从 REPL 执行时则不然 E g abstract type Asset end abstract
  • 使用 Eclipse 在远程计算机中运行 Spark/Cloudera 应用程序

    我在理解使用 Scala Spark shell 和 Hadoop 环境进行开发的逻辑架构时遇到了一些问题 为了更好地描述逻辑架构 我画了一个小架构 如图所示 我在我的个人电脑上安装了 Eclipse 我想以远程模式从我的电脑运行 scal
  • C++ Windows API - 如何检索字体缩放百分比

    我想检索 把文字变大 C Windows API 应用程序中的百分比 我知道如何检索缩放 DPI 系数 但我还想包括字体缩放百分比 请参阅附图 上值 而不是下值 最终 我想要制作保留用户字体和 DPI 缩放设置的应用程序 以便完全支持辅助功
  • Kivy 日期选择器小部件

    已解决 请参阅下面的已接受答案的应用程序和功能 kivy DatePicker 小部件的源代码 我一直在学习 Kivy 并决定制作一个日期选择器小部件作为学习练习 import kivy kivy require 1 4 0 from ki
  • 在android中将SQLite数据库与远程mysql数据同步

    android中如何同步SQLite数据库和远程MySQL数据 为了说清楚 我想知道sqlite数据和远程mysql之间的同步是如何工作的 即 当远程mySQL数据库更新时 SQLite数据也应该更新 而无需按下任何按钮或向下滚动 如何使用
  • 使用线程打印奇偶数

    使用线程打印奇偶数 创建一个线程类 两个线程实例 一个将打印奇数 另一个将打印偶数 我做了以下编码 但到了死锁状态 有人可以解释一下这可能是什么原因吗 public class NumberPrinter implements Runnab
  • 我可以在某些列值上使用 pandas 数据框读取一系列行吗?

    这是我的数据 prakash 101 Ram 107 akash 103 sakshi 115 vidushi 110 aman 106 lakshay 99 我想从中选择所有行akash to vidushi或所有行Ram to aman
  • UICollectionview rollToItemAtIndexPath,在动画完成之前不加载可见单元格

    我有一个UICollectionView有 142 个电池 7 5 随时可见 我正在从以下位置移动一个单元格indexPath0 表示 100 但我也想滚动到那个新位置 下面的代码工作正常 但它对移动和滚动进行动画处理 然后加载中央 移动单
  • 如何向 WiX 工具集添加可选 UI

    我已经为项目部署制作了一个安静的安装程序 无需单击任何按钮 但安装过程中会显示一些进度条 这次我想添加一个可选的图形用户界面 默认情况下 当给出参数时 安装程 序应该直接运行而不单击任何内容 比方说 msiexec范围 qf 安装程序会弹出
  • Eclipse:在 log4j.xml 中引用 log4j.dtd

    我已经使用 log4j 有一段时间了 我通常在 log4j xml 的顶部使用它 可能就像许多其他人一样 根据 Google 的说法 这是the方法 显然这是可行的 但是 Eclipse 不提供用于编写 XML 等内容的上下文相关帮助 此外
  • webkit-transform 覆盖 Chrome 13 中的 z-index 排序

    Update 抱歉未能添加我们也分层了很多的小细节div元素彼此叠加z index 在对这个问题进行更多研究之后 似乎webkit transform实际上与z index顺序 并且实际问题与动画本身无关 结束更新 我目前正在开发一个应用程
  • 为什么 getElementsByTagName 返回未定义?

    我正在尝试打电话document getElementsByTagName 我回来了undefined结果 无论我传递什么参数 即使我通过了 我尝试用谷歌搜索它 但所有搜索结果都是关于 getElementsByTagName 结果数组的元
  • C# 字典到 .csv

    我有 C Dictionary我想创建一个 csv从中获取文件 例如我有这本字典 Dictionary
  • 设置 Visual Studio 的“附加到进程”对话框中显示的“标题”值?

    当您在 Visual Studio 中选择 调试 附加到进程 时 显示的对话框具有 标题 列 默认情况下 这显示属于该进程的主窗口的标题 例如 它可能会显示 这是一个漆黑的暴风雨之夜 记事本 如何为没有主窗口的应用程序 例如 Windows
  • 为什么不对临时对象进行非常量引用? [复制]

    这个问题在这里已经有答案了 C 只允许将临时对象分配给 const 引用 它不允许分配临时对象来引用 例如 String a String test Error const String a String test Ok 我到处谷歌搜索这个
  • 为什么我的 ES6(使用 Babel)类在实例方法中显示“this”未定义?

    我正在使用 Hapi JS 在 Node 中构建一个应用程序 我有一个身份验证插件类 它给我带来了各种各样的问题 当我尝试引用时this从类的方法中 我收到一条错误消息this未定义 为什么会发生这种情况 摘录 class OAuth co