在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
)。