1

如果没有:你将如何做到这一点:

  • 通过 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条路?

4

0 回答 0