我有一个继承的类,并且需要父类具有一个虚方法,该方法在子类中被重写。这个方法是从基础构造函数调用的,需要访问实例属性,所以它需要是一个lambda函数,所以“this”就是“_this”。问题是,覆盖lambda方法对我来说不起作用,就像重写非lambda一样。这可能吗?如果没有,我想了解原因。
此外,当仅从构造函数调用方法时,“this”是否始终与“_this”相同?
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");
}
}
输出:
派生初稿
基础initLambda
答案 0 :(得分:12)
嗯,你不能那样 有an issue that was opened,但它被“按设计”关闭。
您应该使用常规方法:
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() {
console.log("Derived initLambda");
}
}
然后它会起作用。
至于保持正确this
,您始终可以将该方法作为箭头函数调用:
doit() {
setTimeout(() => this.init(), 1);
}
或使用Function.prototype.bind功能:
setTimeout(this.init.bind(this));
此外,打字稿编译器生成的_this
事件只是对ES5的箭头函数进行polyfil的破解,但是如果将目标更改为ES6则不会使用它。
您可以将绑定方法保存为成员:
class Base {
...
public boundInit: () => void;
constructor() {
...
this.boundInit = this.initLambda.bind(this);
setTimeout(this.boundInit, 500);
}
...
有了这个,当我做new Derived()
这就是我得到的:
派生初稿 派生的initLambda //在200毫秒之后
答案 1 :(得分:2)
问题是你的lambda是一个属性。
编译为javascript时,Base
类变为
var Base = (function () {
function Base() {
this.prop = null;
this.initLambda = function () {
console.log("Base initLambda");
};
this.init();
this.initLambda();
}
Base.prototype.init = function () {
console.log("Base init");
};
return Base;
}());
正如您所看到的,initLambda
在Base
的构造函数中定义了 ,因此您无法覆盖它。
调用super()
调用Base
构造函数,该构造函数使用this.initLambda
中的代码定义Base
并运行它。因此你的结果。