是否可以在JavaScript中从ECMAScript 6类继承旧式类?

时间:2015-10-27 13:20:28

标签: javascript node.js ecmascript-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'

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

1 个答案:

答案 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