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

IT技术 javascript node.js ecmascript-6
2021-01-29 03:46:15

在 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个回答

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

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

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

function MyDerived() {
  var derived = new MyClass('MyDerived');
  … // set up properties
  return derived;
}

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

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

这有一个额外的好处,MyDerived不需要再调用new(只要你提供MyDerivedwhennew.target为空)。