gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:49:40 25 4
gpt4 key购买 nike

在 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 关键字来完成的,这是一个构造函数调用,类似于 。在当前“未初始化”的子实例上“应用”( .call() ) 父构造函数的旧习惯不再起作用

您仍然可以做的是诉诸“寄生继承” - 您必须显式构造实例,扩展它,然后返回它:

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

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

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

这还有一个额外的好处,即不再需要使用 new 调用 MyDerived (只要您在以下情况下提供 MyDerived new.target 为空)。

关于javascript - 是否可以从 JavaScript 中的 ECMAScript 6 类继承旧式类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43041093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com