javascript - 是否可以间接调用 X 是 ES6 类的构造函数?

标签 javascript ecmascript-6

这与 an old question 有关但我特别询问有关使用编写函数的旧方法扩展新的 ES6 类的问题。

以下代码无效。

class X {
    a;
    constructor(a) {
        this.a = a;
    }
}
X.call({}, 3); // Uncaught TypeError: Class constructor X cannot be invoked without 'new'

有没有办法间接调用构造函数?比如我是不是可以用老套的原型(prototype)继承来做一个Y?

function Y(a) {
    X.call(this, a); // this doesn't work here, can't use super as well
}
Y.prototype = Object.create(X.prototype);
Object.setPrototypeOf(Y, X);
const y = new Y(12);

最佳答案

是的,您可以使用 Reflect.constructnew.target :

function Y(a) {
    return Reflect.construct(X, [a], new.target || Y);
}

实例:

class X {
    a;
    constructor(a) {
        this.a = a;
    }
}

function Y(a) {
    return Reflect.construct(X, [a], new.target || Y);
}
Y.prototype = Object.create(X.prototype);
Object.setPrototypeOf(Y, X);
const y = new Y(12);
console.log(y.a); // 12

或者如果您想传递所有提供的参数:

function Y(...args) {
    return Reflect.construct(X, args, new.target || Y);
}

关于javascript - 是否可以间接调用 X 是 ES6 类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64467673/

相关文章:

php - 我需要在服务器端更改什么才能启用 chunkedMode = true?

javascript - ES6 WeakMap 的实际用途是什么?

javascript - 在 ES6 模块中定义全局变量的正确方法是什么?

javascript - 从 <a> 标签获取 href 值

javascript - node.js:在 bluebird 中重新抛出错误时保留堆栈跟踪

javascript - 在通过 javascript(也是谷歌地图)传递值之前等待循环完成。

javascript - 如何使用带有源文件符号路径的 ES6 导入功能?

javascript - 不使用@语法来装饰ES6类方法?

Javascript/ lambda : How to make the following code functional

javascript - WebSocket如何压缩消息?