有可能从JavaScript中的ECMAScript 6类继承旧式类吗?

Is it possible to inherit old-style class from ECMAScript 6 class in JavaScript?

本文关键字:继承 6类 JavaScript 中的 ECMAScript 有可能      更新时间:2023-09-26

在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"类"?如果可能的话,怎么做呢?

一旦您选择了class语法,就没有真正的出路了。

问题是ES6中的继承是通过使用super()的返回值初始化this关键字来完成的,这是一个与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一起调用(只要在new.target为空时提供MyDerived)。