我可以用 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 {
...
}
由于 class
和 extends
关键字只是原型继承之上的语法糖,答案很简单:是的,您可以将 util.inherits
替换为 extends
并保持相同的行为。
当然,还有一些小事需要注意,例如您需要确保在派生的 class 的构造函数中调用 super
构造函数,而对于 util.inherits
您必须调用构造函数并将 apply
调用到 this
。但实际上,这些东西只是其他句法结构,在语义上,它们是等价的。
然后,当然,还有一些实际问题,两个选项彼此不同。例如,当使用 class
关键字定义 Foo
时,您不能在不使用 new
关键字的情况下调用 Foo
。如果没有 class
关键字,这是完全可能的(虽然没有意义,所以无论如何你都不应该这样做)。
所以,长话短说:除了一些只有在使用罕见和奇怪的构造时才会发生的奇怪效果(比如在没有 new
的情况下调用构造函数),过渡应该是无缝的。
我正在尝试将一些 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 {
...
}
由于 class
和 extends
关键字只是原型继承之上的语法糖,答案很简单:是的,您可以将 util.inherits
替换为 extends
并保持相同的行为。
当然,还有一些小事需要注意,例如您需要确保在派生的 class 的构造函数中调用 super
构造函数,而对于 util.inherits
您必须调用构造函数并将 apply
调用到 this
。但实际上,这些东西只是其他句法结构,在语义上,它们是等价的。
然后,当然,还有一些实际问题,两个选项彼此不同。例如,当使用 class
关键字定义 Foo
时,您不能在不使用 new
关键字的情况下调用 Foo
。如果没有 class
关键字,这是完全可能的(虽然没有意义,所以无论如何你都不应该这样做)。
所以,长话短说:除了一些只有在使用罕见和奇怪的构造时才会发生的奇怪效果(比如在没有 new
的情况下调用构造函数),过渡应该是无缝的。