Cod*_*ist 5 javascript inheritance node.js ecmascript-6 es6-class
我正在尝试将一些 es5 代码转换为 es6,我偶然发现了以下代码,我想知道是否可以用类util.inherits的extends关键字替换。如果他们做同样的事情,我有点困惑。
var EventEmitter = require('events').EventEmitter;
var util = require('util');
function TheEmitter() {
EventEmitter.call(this);
}
util.inherits(TheEmitter, EventEmitter);
Run Code Online (Sandbox Code Playgroud)
const EventEmitter = require('events').EventEmitter;
class TheEmitter extends EventEmitter {
...
}
Run Code Online (Sandbox Code Playgroud)
由于classandextends关键字只是原型继承之上的语法糖,答案很简单:是的,您可以替换util.inherits为extends并保持相同的行为。
当然,有一些小事情需要注意,例如,您需要确保super在派生类的util.inherits构造函数中调用构造函数,而在调用构造函数时必须将其调用apply到this. 但实际上,这些东西只是其他句法结构,在语义上,它们是等价的。
然后,当然,还有一些实际问题,这两种选择彼此不同。例如,Foo使用class关键字定义时,Foo不使用new关键字就不能调用。没有class关键字,这是完全可能的(虽然没有意义,所以无论如何你都不应该这样做)。
所以,长话短说:除了一些只有在使用稀有和奇怪的构造时才会发生的奇怪效果(例如调用没有 的构造函数new)之外,过渡应该是无缝的。