gpt4 book ai didi

typescript - 我可以有 `super` 或这个,但不能两者都有?

转载 作者:搜寻专家 更新时间:2023-10-30 21:52:18 25 4
gpt4 key购买 nike

我一直在使用 Typescript (2.1) 和类,特别是扩展另一个类的类。

如果我声明一个函数为

foo = () => {}

然后我可以安全地在函数中使用this

但是我不能使用super.foo(),因为我得到了错误

TypeError:(中间值).foo 不是函数

如果我将函数声明为

foo() { }

然后我可以使用super.foo()但我不能确定this是否指向同一个“this”始终,取决于函数的调用方式

我该如何解决这个问题?我已经看到一些建议,我必须双重声明所有函数并将 bind 一个函数与另一个函数相结合,但这似乎很荒谬.. typescript 没有一些“神奇”的语法糖来覆盖所有这种丑陋?

谢谢;)

最佳答案

类方法可以在实例原型(prototype) 上。不幸的是,你不能既吃蛋糕又吃蛋糕。

当方法在实例上时,每个类实例的每个方法都有一个闭包,并且每个实例的闭包都有自己的 _this 副本,因此可以任意调用该函数。但是因为方法绑定(bind)到实例,派生类的实例化不会使用基类的方法代码创建任何现存的方法。

当方法在原型(prototype)上时,每个方法都有一个闭包,这些方法是未绑定(bind)的,因此必须使用正确的方法语法调用。在这里您可以调用基类实现,因为有一个已知位置可以从 (BaseClass.prototype.methodName) 获取基类方法。

一个好的解决方案是编写一个 protected static 基类方法来处理 foo 将调用的逻辑,并让您的实例方法遵循静态方法。这大致是两全其美,代价是增加了一个间接级别。

例子:

class Base {
protected static foo(instance: Base) {
instance.counter++;
}

counter = 0;

foo = () => Base.foo(this);
}

class Derived extends Base {
foo = () => {
Base.foo(this);
this.counter *= 2;
}
}

关于typescript - 我可以有 `super` 或这个,但不能两者都有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41230266/

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