我可以用 es6 的 extend 关键字替换 util.inherits 吗?

Can i replace util.inherits with es6's extend keyword?

我正在尝试将一些 es5 代码转换为 es6,我偶然发现了以下代码,我想知道是否可以将 util.inherits 替换为 类 的 extends 关键字.如果他们做同样的事情,我有点困惑。

ES5

var EventEmitter = require('events').EventEmitter;
var util = require('util');

function TheEmitter() {
    EventEmitter.call(this);
}
util.inherits(TheEmitter, EventEmitter);

ES6

const EventEmitter = require('events').EventEmitter;

class TheEmitter extends EventEmitter {
   ...
}

由于 classextends 关键字只是原型继承之上的语法糖,答案很简单:是的,您可以将 util.inherits 替换为 extends并保持相同的行为。

当然,还有一些小事需要注意,例如您需要确保在派生的 class 的构造函数中调用 super 构造函数,而对于 util.inherits 您必须调用构造函数并将 apply 调用到 this。但实际上,这些东西只是其他句法结构,在语义上,它们是等价的。

然后,当然,还有一些实际问题,两个选项彼此不同。例如,当使用 class 关键字定义 Foo 时,您不能在不使用 new 关键字的情况下调用 Foo。如果没有 class 关键字,这是完全可能的(虽然没有意义,所以无论如何你都不应该这样做)。

所以,长话短说:除了一些只有在使用罕见和奇怪的构造时才会发生的奇怪效果(比如在没有 new 的情况下调用构造函数),过渡应该是无缝的。