静态

静态方法

把一个方法赋值给类的函数本身,而不是赋给它的 "prototype"。这样的方法被称为静态的(static)
通常,静态方法用于实现属于该类不属于该类任何特定对象的函数。

  1. class User { }
  2. User.staticMethod = function() {
  3. alert(this === User);
  4. };
  5. User.staticMethod(); // true

静态属性

  1. class Article {
  2. static publisher = "Levi Ding";
  3. }
  4. alert( Article.publisher ); // Levi Ding

继承静态属性和方法

静态属性和方法是可被继承的。

实现原理:

extendsRabbit[[Prototype]] 指向了 Animal
所以,Rabbit extends Animal 创建了两个 [[Prototype]] 引用:

  1. Rabbit** 构造函数的原型指向 Animal 函数。**
  2. Rabbit.prototype** 原型指向 Animal.prototype。**

image.png

  1. class Animal {}
  2. class Rabbit extends Animal {}
  3. // 对于静态的
  4. alert(Rabbit.__proto__ === Animal); // true
  5. // 对于常规方法
  6. alert(Rabbit.prototype.__proto__ === Animal.prototype); // true

私有的和受保护

在面向对象的编程中,属性和方法分为两组:

  • 内部接口 —— 可以通过该类的其他方法访问,但不能从外部访问的方法和属性。
  • 外部接口 —— 也可以从类的外部访问的方法和属性。


在 JavaScript 中,有两种类型的对象字段(属性和方法):

  • 公共的:可从任何地方访问。它们构成了外部接口。到目前为止,只使用了公共的属性和方法。
  • 私有的:只能从类的内部访问。这些用于内部接口。


受保护属性

受保护的属性通常以下划线 _ 作为前缀。主要通过getter和setter访问器属性实现
但这种实现,**仍能被继承**到;

  1. class CoffeeMachine {
  2. _waterAmount = 0;
  3. set waterAmount(value) {
  4. if (value < 0) throw new Error("Negative water");
  5. this._waterAmount = value;
  6. }
  7. get waterAmount() {
  8. return this._waterAmount;
  9. }
  10. constructor(power) {
  11. this._power = power;
  12. }
  13. }
  14. // 创建咖啡机
  15. let coffeeMachine = new CoffeeMachine(100);
  16. // 加水
  17. coffeeMachine.waterAmount = -10; // Error: Negative water

私有的**

  • 私有属性和方法应该以 **#** 开头
  • 它们只在类的内部可被访问。无法从外部或从继承的类中访问它。
  • 私有字段不能通过 this[name] 访问

同时, 私有字段公共字段 不会发生冲突。可以同时拥有私有的 #waterAmount 和公共的 waterAmount 字段。

  1. class CoffeeMachine {
  2. #waterLimit = 200;
  3. #checkWater(value) {
  4. if (value < 0) throw new Error("Negative water");
  5. if (value > this.#waterLimit) throw new Error("Too much water");
  6. }
  7. sayHi() {
  8. let fieldName = "name";
  9. alert(`Hello, ${this[fieldName]}`); // 报错
  10. }
  11. }
  12. let coffeeMachine = new CoffeeMachine();
  13. // 不能从类的外部访问类的私有属性和方法
  14. coffeeMachine.#checkWater(); // Error
  15. coffeeMachine.#waterLimit = 1000; // Error