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

wee*_*ens 7 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();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

constructor(name) {
         ^

TypeError: Class constructors cannot be invoked without 'new'
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 8

一旦你选择了class语法,就没有出路了.

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

你仍然可以做的是诉诸"寄生继承" - 你必须显式构造实例,扩展它,return它:

function MyDerived() {
  var derived = new MyClass('MyDerived');
  … // set up properties
  return derived;
}
Run Code Online (Sandbox Code Playgroud)

当您执行此操作时new MyClass,您将无法正确设置原型.为此,您需要使用新的ES6 Reflect.construct函数,该函数将子类作为可选的第三个参数:

function MyDerived() {
  var derived = Reflect.construct(MyClass, ['MyDerived'], new.target||MyDerived);
  … // set up properties
  return derived;
}
Run Code Online (Sandbox Code Playgroud)

这具有额外的好处,MyDerived不需要再调用new(只要你MyDerivednew.target空时提供).