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

Cod*_*ist 5 javascript inheritance node.js ecmascript-6 es6-class

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

ES5

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

function TheEmitter() {
    EventEmitter.call(this);
}
util.inherits(TheEmitter, EventEmitter);
Run Code Online (Sandbox Code Playgroud)

ES6

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

class TheEmitter extends EventEmitter {
   ...
}
Run Code Online (Sandbox Code Playgroud)

Gol*_*den 6

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

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

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

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