【问题标题】:ES6 classes and function usage within NodeNode 中的 ES6 类和函数使用
【发布时间】:2019-07-24 12:41:17
【问题描述】:

我一直在学习一些 React,并且一直在使用 ES6 类来编写基于类的组件。我正在做一个小 Node 项目,但这些语法都不起作用。

class Handler {
  handleReq = () => {
    this.ctx = ctx;
  };

  testFunc = async () => {

  };
}

export default (HandleReq = Handler.prototype.handleReq);

这个语法有什么问题?它不在Node中运行吗?我必须安装esm 才能使导入/导出语法正常工作,但这仍然无法编译。

【问题讨论】:

  • 类属性还不是有效的 ES,它们处于提案阶段。今天你必须使用编译器 lile BabelJS 来处理它们。,
  • 明白了,这些天人们通常会做什么来获得这种东西?他们会编写旧式代码吗?
  • Handler.prototype.handleReq 将永远无法工作,因为handleReq 必须绑定到一个实例,因此它只会存在于一个实例上((new Handler).handleReq
  • @JohnLippson 是的,他们只是使用普通的class 方法或将箭头函数放在它们所属的构造函数中。您似乎没有发布完整的代码,但我怀疑您是否需要箭头函数。
  • export default (HandleReq = Handler.prototype.handleReq); 应该完成什么?除了在分配未声明的全局变量时抛出异常之外,如果您导出的只是一个方法,为什么还要使用 class

标签: javascript node.js ecmascript-6


【解决方案1】:

Class Fields 仍处于提案阶段(已经是第 3 阶段,因此它们将很快成为语言的一部分)。这意味着一些运行时可能已经支持它们,但它们还没有必要。要在今天可靠地使用提案,您必须将其转译为 BabelJS

这会将您的代码转换为以下 ES6:

 class Handler {
  constructor() {
    this.handleReq = () => {
      this.ctx = ctx;
    };

    this.testFunc = async () => {
    };
   }
 }

因此这些方法实际上只存在于构造后的实例上,而不存在于Handler.prototype

【讨论】:

    【解决方案2】:

    正如其他人所指出的,如果没有转译,类字段还不是 ES6 语法的一部分。如果你想避免构建步骤,等效的节点语法是:

    // import someImport from './some-import' is invalid, instead use:
    const someImport = require('./some-import');
    
    class Handler {
      constructor() {
        this.handleReq = this.handleReq.bind(this);
        this.testFunc = this.testFunc.bind(this);
      }
    
      handleReq() {
        this.ctx = ctx; // Where is ctx coming from?
      }
    
      async testFunc() {
    
      }
    }
    
    // export default Handler.prototype.handleReq is invalid, instead use:
    module.exports = Handler.prototype.handleReq;
    

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2018-04-09
      • 1970-01-01
      • 2018-06-06
      • 2020-05-10
      相关资源
      最近更新 更多