从构造函数中引用TypeScript类方法和属性的正确方法是什么?

从构造函数中引用TypeScript类方法和属性的正确方法是什么?,typescript,class,Typescript,Class,我有一个带构造函数的TypeScript类。我的目标是通过调用构造函数中的baz方法来更改bar属性值。但是,baz方法似乎没有效果。调用baz方法后,我希望bar属性值为蓝色。相反,该值保持为红色 class Foo { bar:string = "red"; baz():void { this.bar = "blue"; }; constructor() { var bar = this.bar; var baz = this.baz; b

我有一个带构造函数的TypeScript类。我的目标是通过调用构造函数中的baz方法来更改bar属性值。但是,baz方法似乎没有效果。调用baz方法后,我希望bar属性值为蓝色。相反,该值保持为红色

class Foo {
  bar:string = "red";

  baz():void {
    this.bar = "blue";
  };

  constructor() {
    var bar = this.bar;
    var baz = this.baz;
    baz();
    console.log(bar) // logs "red";
  }
}

var x = new Foo();

问题是您正在打印的是bar的本地副本。它被指定为红色。在调用baz之后,this.bar应该是蓝色的,但是本地的bar仍然是红色的

试试这个:

constructor() {
    // var bar = this.bar; // unnecessary
    // var baz = this.baz; // unnecessary
    this.baz();
    console.log(this.bar) // should be "blue";
  }

这里实际上有两个问题:

您对this.baz的引用绑定不正确。 您正在记录在调用该方法之前»复制«的对象。 让我们先解决2个问题。基本上,您正在这样做:

let value = "red";
let bar = value;
value = "blue";
console.log(bar); // logs red
很明显,既然您重新分配了引用,那么它为什么不会记录为蓝色。这不会»传播«到酒吧。代码中也会发生同样的情况:

var bar = this.bar;
// … reassign this.bar, but not bar
console.log(bar); // will not log the updated value
第二个问题是,您需要使用

var baz = this.baz.bind(this);

为了获得正确的上下文,或者直接调用this.baz。

这只是答案的一半。