将函数导出为 const 和类方法之间的区别

问题描述

这两种导出方法间的区别是什么?在哪些情况下我们将类导出为 const 并将函数导出为 const ?哪个是 ES6+ 兼容的?

// approach1.js
class Sample1 {
  hello(visitorName) {
    return `hello ${visitorName}`;
  }
}

module.exports = Sample1;

// approach2.js
const hello = (visitorName) => {
  return `hello ${visitorName}`;
};
module.exports = hello;

测试类

// test.js
const Sample1 = require('./approach1');
const sample2 = require('./approach2');

async function start() {
  const returnValueForApproach1 = (new Sample1()).hello('Name');
  console.log(returnValueForApproach1);

  const returnValueForApproach2 = sample2('Name');
  console.log(returnValueForApproach2);
}
start();

输出
你好名字
你好名字

解决方法

当数据存储在实例上时,您通常希望使用类 - 也就是说,当您需要在至少一个方法中引用 this 时。例如:

class Sample1 {
  constructor(name) {
    this.visitorName = name;
  }
  hello() {
    return `hello ${this.visitorName}`;
  }
}

const s = new Sample1('foobar');
// ... followed by some code,then
console.log(s.hello());

如果您从未在实例上存储数据,那么使用类并没有多大意义,因为它毫无理由地增加了一些额外且有些令人困惑的开销。 JavaScript 不是 Java - 不要觉得您必须将所有内容都绑定到一个类中。

如果你只有一个单一功能,就像你的例子一样,那么你的第二个例子

const hello = (visitorName) => {
  `hello ${visitorName}`;
};
module.exports = hello;

到目前为止最有意义;只需声明并导出函数。

如果您有一个集合与实例数据无关的函数,您可以使用这些函数导出一个对象,例如:

module.exports = {
  fn1() {
    // code
  },fn2() {
  }
};

问题和这个答案中的所有代码都使用 ES6 语法,所以我认为它是“ES6 兼容的”。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...