我试图通过父类调用的方法访问私有属性。
这不起作用。我想那是因为它是父类的调用,而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()
仍由父类调用,所以我不明白为什么现在可以访问它。
有人可以解释吗?
答案 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。