TS:类私有属性未定义,但私有静态未定义。为什么?

时间:2019-08-18 10:19:01

标签: typescript

我试图通过父类调用的方法访问私有属性。

这不起作用。我想那是因为它是父类的调用,而private value属于子类,所以它是不可见的;

abstract class Block {
  constructor (x: number, y: number) {
    this.x = x
    this.y = y
    this.build()
  }

  protected abstract build(): void
}

class Square extends Block {
  private value:number = 1

  protected build() {
    console.log('do stuff with x & y & value', this.value) // this.value = undefined
  }
}

new Square(10, 10)

由于在我的用例value中是一个常量,因此我尝试了一些其他操作,最后想到了:

class Square extends Block {
  private static readonly value:number = 1

  protected build() {
    console.log('do stuff with x & y & value', Square.value) // works
  }
}

这有效。我很高兴。

但是在我看来, private 关键字应该可以正常工作。而且由于build()仍由父类调用,所以我不明白为什么现在可以访问它。

有人可以解释吗?

1 个答案:

答案 0 :(得分:3)

new Square(10, 10)上,您隐式调用了构造函数。您可能没有注意到它,但是Square也有一个。如果将您的打字稿代码转换为javascript,则会得到类似以下内容的信息:

class Square extends Block {
    constructor() {
        super(...arguments);
        this.value = 1;
    }

如您在此处看到的,Block#constructor首先被调用,当尚未设置build时调用this.value。执行build之后,先将value设置为1。

相关问题