扩展类中未定义箭头函数



我有一个类,以及扩展第一个类的另一个类。在我的代码中,我创建了扩展类的新实例:new MyCustomEndpoint(router);

问题是handleIsNotOkundefinedinitMyRoutes

export class MyEndpoint {
constructor(router: express.Router) {
this.initMyRoutes(router); 
}
protected initMyRoutes(router: express.Router) {
router.get(`/v1/isok`, this.handleIsOk);
}
protected handleIsOk = (req: express.Request, res: express.Response) => {
res.send(200);
}
}

export class MyCustomEndpoint extends MyEndpoint{
private test = "Test";
protected initMyRoutes(router: express.Router) {
console.log(this.handleIsNotOk); // undefined
console.log(this.handleIsNotOkFn);
router.get(`/v1/isokcustom`, this.handleOk); // this works
router.get(`/v1/isnotok`,this.handleIsNotOk); // this doesn't works
router.get(`/v1/isnotokfn`, this.handleIsNotOkFn); // this doesn't works
router.get(`/v1/isnotokfn`, (req, res)this.handleIsNotOkFn(req,res)); // works but it's ugly since it's different compared to router.get(`/v1/isokcustom`, this.handleOk);
}
protected handleIsNotOk = (req: express.Request, res: express.Response) => {
res.send(200);
}
protected handleIsNotOkFn(req: express.Request, res: express.Response){
console.log(this.test); // undefined
res.send(200);
}
}
...
new MyCustomEndpoint(router);

为什么会发生这种情况?在我看来不应该是undefined

我打赌这个就是原因

router.get(`/v1/isnotokfn`, this.handleIsNotOkFn); 

,如果你把它绑定到实例,它会工作得很好:

router.get(`/v1/isnotokfn`, this.handleIsNotOkFn.bind(this)); 

自我回答

感谢@mbojko @Keith @VLAZ和其他所有人的答案。即使技术上是正确的,解决方案也不符合我的需要。我的用例有点特殊,我这样做是有原因的。

供参考:这就是我需要的解决方案

export class MyCustomEndpoint extends MyEndpoint{
constructor(router: express.Router) {
super(router);
this.initCustomRoutes(router);
}
// will be called in the constructor of the super class
protected initMyRoutes(router: express.Router) {
router.get(`/v1/isokcustom`, this.handleOk); 
}
private initCustomRoutes(router: express.Router) {
router.get(`/v1/isokcustom`, this.handleOkCustom); 
}
protected handleOkCustom = (req: express.Request, res: express.Response) => {
res.send(200);
}
}

覆盖initMyRoutes,等待母类调用新的initMyRoutes。在MyCustomEndPoint中应该有一个调用initMyRoutes的构造函数。MyCustomEndPoint从不调用initMyRoutes

最新更新