在JavaScript中可以inheritanceECMAScript 6类中的旧式类吗?

在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' 

我想知道是否可以inheritanceECMAScript 6类的旧式JavaScript“类”? 而且,如果可能的话,那么怎么样?

一旦你select了class语法,就没有什么出路了。

问题是ES6中的inheritance是通过使用super()的返回值来初始化this关键字来完成的,这是一个类似于new的构造函数调用。 在当前“未初始化的”子实例上“应用”( .call() )父构造函数的老习惯不再有效

你仍然可以做的是诉诸“寄生inheritance” – 你必须明确地构造实例,扩展它,并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调用(只要你new.target为空时提供MyDerived )。