gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:38:24 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;
}

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

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

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