我一直在使用 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/