我不能在快递路线中使用“ this”。这是为什么?因为我需要B类的多个方法中的this.postRepo
。还有其他方法吗?
// Parent
export default abstract class A {
// no constructor
// few methods
}
// Child
export default class B extends A {
public postRepo: number
constructor() {
super();
this.postRepo = 111;
}
public methodA(req?: Request, res?: Response): any {
console.log(this); // undefined
console.log(this.postRepo); // TypeError: Cannot read property 'postRepo' of undefined
}
// ...methods that required this.postRepo
}
// New
const classB = new B();
classB.methodA(); // <--- this is working
router.get("/", classB.methodA); // <--- undefined
答案 0 :(得分:2)
我想methodA失去了它的上下文。在这种情况下,可以用箭头函数替换该方法,它们的上下文是稳定的:
public methodA = (req?: Request, res?: Response) => {
console.log(this); // undefined
console.log(this.postRepo); // TypeError: Cannot read property 'postRepo' of undefined
}
答案 1 :(得分:1)
将methodA绑定到构造函数中。
this.methodA = this.methodA.bind(this);
// Child
export default class B extends A {
public postRepo: number
constructor() {
super();
this.postRepo = 111;
this.methodA = this.methodA.bind(this); // add this line
}
public methodA(req?: Request, res?: Response): any {
console.log(this); // undefined
console.log(this.postRepo); // TypeError: Cannot read property 'postRepo' of undefined
}
// ...methods that required this.postRepo
}
答案 2 :(得分:0)
感谢一个人在我的Facebook帖子上回复了
classB.methodA.bind(classB)
是解决方案
答案 3 :(得分:0)
router.get(“ /”,classB.methodA);在这里,您要引用该方法,这意味着它不会携带您定义该方法的实例的上下文。您可以使用.bind方法,也可以使用箭头功能绑定上下文。
答案 4 :(得分:0)
因为呼叫者不是classB。 这将是未定义的默认绑定