子类中未定义的“ this”

时间:2019-10-10 05:20:49

标签: javascript node.js typescript express

我不能在快递路线中使用“ 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

5 个答案:

答案 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。 这将是未定义的默认绑定