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

Diff between exporting function as const and class method

这两种导出方法之间的区别是什么?我们在哪些情况下导出 class 并将函数导出为 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;

测试Class

// 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();

输出:
你好名字
你好姓名

当数据存储在 实例 上时,您通常希望使用 class - 也就是说,当您需要在 at 中引用 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());

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

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

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

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

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

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

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