在提供给 super() 的函数中引用类实例

Reference class instance in function provided to super()

提问人:Matt 提问时间:5/14/2021 最后编辑:Matt 更新时间:5/14/2021 访问量:105

问:

假设我有以下超类:

class Super {
    constructor(printMyName) {
        this.name = 'Fred';
        printMyName();
    }
}

以及一个扩展它的类:

class Child extends Super {
    constructor() {
        super(() => {
            console.log(this.name);
        });
    }
}

这是错误的,因为我的子类在超级构造之前尝试引用实例字段 - “this”关键字在调用之后才可用。super()

如何在我提供的方法中使用实例字段?super

编辑

正如@Bergi正确指出的那样,这种情况在目前的形式下是没有意义的。我的实际情况稍微复杂一些,因为我提供的函数是异步运行的,因此应该有可用的实例数据。这包括在父类和子类中声明的实例字段。super

为了尽量减少对原始示例的更改,让我们添加一个 setTimeout 以使函数异步运行:

class Super {
    constructor(printMyFullName) {
        this.firstName = 'Fred';
        setTimeout(printMyFullName, 10000);
    }
}

让我们允许子类在调用 :super

class Child extends Super {
    constructor(opts) {
        super(() => {
            console.log('%s %s', this.firstName, this.lastName);
        });

        this.lastName = 'Savage';
    }
}

这个问题仍然适用,但我要澄清一下:如何在提供给 的函数中使用子实例和父实例数据?super

JavaScript 继承 这个 超级 ES6 类

评论

0赞 Bergi 5/14/2021
不要将方法传递给 。你为什么要这样做?只需写.如果您有实际用例,请告诉我们更多关于您的实际问题的信息。supersuper(); console.log(this.name);
0赞 Matt 5/14/2021
确定。我有一个超类,它呈现通过其构造函数提供给它的对话框内容。默认情况下,它有 2 个按钮,“确认”和“取消”。该类在其构造函数中接受一个参数。我还有一个扩展的类。在它的构造函数中,我调用并提供了它的参数。B/c 当用户确认对话框时,函数是异步运行的,实例数据可供它使用是有意义的。所以我希望能够引用该实例。ConfirmationDialogonConfirmExportDialogConfirmationDialogsuperConfirmationDialogonConfirmonConfirmonConfirm
1赞 Bergi 5/14/2021
如果它是异步运行的,而不是像您的问题那样从超类构造函数中同步调用,则使用 in the arrow 函数就可以了。(也就是说,我建议不要在构造函数中渲染任何内容)this
0赞 Matt 5/14/2021
正如你所说,我不确定是否有效。当我尝试使用我在上面的编辑中所写的内容时,出现以下错误:.thisthisTypeError: attempted to get private field on non-instance
0赞 Bergi 5/14/2021
您发布的代码中没有私有字段。运行代码按预期工作。

答: 暂无答案