I have an inherited class, and need the parent to have a virtual method, which is overridden in the child class. This method is called from the base constructor, and needs access to instance properties, so it needs to be a lambda function, so "this" is "_this". The problem is, overriding a lambda method does not work for me like overriding a non-lambda does. Is this possible? If not, I'd like to understand why.
Also, will "this" always be the same as "_this" when the method is only called from the constructor?
class Base {
protected prop = null;
constructor() {
this.init();
this.initLambda();
}
init() {
console.log("Base init");
}
initLambda = () => {
console.log("Base initLambda");
}
}
class Derived extends Base {
constructor() {
super();
}
init() {
console.log("Derived init");
}
initLambda = () => {
//let x = this.prop;
console.log("Derived initLambda");
}
}
Output:
Derived init
Base initLambda
The problem is that your lambda is a property.
When compiled to javascript, the
Base
class becomesAs you can see
initLambda
is defined inside the constructor ofBase
, so there is no way you can override that.Calling
super()
calls theBase
constructor which defines thethis.initLambda
with the code inBase
and runs it. Hence your result.View on playground
Well, you can't have that.
There's an issue that was opened but it was closed as "by design".
You should use regular methods:
And then it will work.
As for keeping the right
this
, you can always pass a call to the method as an arrow function:Or use the Function.prototype.bind function:
Also, the
_this
thing that the typescript compiler produces is just a hack to polyfil the arrow functions for ES5, but if you change the target to ES6 then it won't use it.Edit:
You can save the bound methods as members:
With that, when I do
new Derived()
this is what I get: