如果没有:你将如何做到这一点:
- 通过 setter 和 getter 公开基类的私有属性,例如在这个答案中
- 或者必须将基类的任何相关方法和属性复制到派生类中
除了在派生类声明中,属性应该保持真正的私有,因此您不能使用受保护的变量下划线_
约定。
假设我有以下代码
class CoffeeMachine {
#waterLimit = 600;
#waterAmount = 0;
constructor() {}
set waterAmount(amount) {
if (amount < 0) {
this.#waterAmount = 0;
} else if (amount > this.#waterLimit) {
this.#waterAmount = this.#waterLimit;
} else {
this.#waterAmount = amount;
}
}
get waterAmount() {
return this.#waterAmount;
}
}
class TeaMachine extends CoffeeMachine {
constructor() {
super();
}
}
我希望TeaMachine
更小,所以我希望它#waterLimit
等于400
而不是600
简单地执行以下操作是行不通的
class TeaMachine extends CoffeeMachine {
#waterLimit = 400;
constructor() {
super();
}
}
const teaBox = new TeaMachine();
teaBox.waterAmount = 1000;
console.log(teaBox.waterAmount); // 600
这是我能得到的最接近的
水限制在启动时设置,但之后不再可用。虽然显然这不是一个完美的解决方案
class CoffeeMachine {
#waterLimit;
#waterAmount = 0;
constructor(limit = 600) {
this.#waterLimit = limit;
}
}
class TeaMachine extends CoffeeMachine {
constructor() {
super(400);
}
}
const teaBox = new TeaMachine();
teaBox.waterAmount = 1000;
console.log(teaBox.waterAmount); // 400
我相信这在 Java 中是可能的
在满足上述条件的同时,甚至可以在 JavaScript 中执行此操作吗?还是我必须接受语言的限制/走这WeakMap
条路?