在Node.js 4.2.1上运行以下代码时:
'use strict';
var util = require('util');
class MyClass {
constructor(name) {
this.name = name;
}
}
function MyDerived() {
MyClass.call(this, 'MyDerived');
}
util.inherits(MyDerived, MyClass);
var d = new MyDerived();
我收到以下错误:
constructor(name) {
^
TypeError: Class constructors cannot be invoked without 'new'
我想知道是否可以从ECMAScript 6类继承旧式JavaScript“类”?而且,如果可能的话,那又怎么样?
答案 0 :(得分:8)
一旦选择class
语法,就没有出路了。
问题在于ES6中的继承是通过使用this
的返回值来初始化super()
关键字来完成的,这是一个像new
一样的构造函数调用。在当前“未初始化”子实例上“应用”(.call()
)父构造函数的旧习惯用法不再工作。
你仍然可以做的是求助于“寄生继承” - 你必须明确地构造实例,扩展它,并return
它:
function MyDerived() {
var derived = new MyClass('MyDerived');
… // set up properties
return derived;
}
使用new MyClass
执行此操作时,您无法正确设置原型。为此,您需要使用新的ES6 Reflect.construct
函数,该函数将子类作为可选的第三个参数:
function MyDerived() {
var derived = Reflect.construct(MyClass, ['MyDerived'], new.target||MyDerived);
… // set up properties
return derived;
}
这样做的另一个好处是MyDerived
不再需要new
调用{只要在MyDerived
为空时提供new.target
。