JavaScript中的私有/静态属性介绍


在JavaScript中,ES6及之前的版本并没有直接支持类的私有属性和静态属性的语法。不过,从ES2020(ECMAScript 2020)开始,JavaScript引入了类的私有属性(通过`#`前缀)和静态属性的语法。

### 私有属性

私有属性使用`#`前缀标识,只能在类内部访问。它们提供了封装性,使得类的外部无法直接访问这些属性。


class MyClass {
  #privateProperty = '这是一个私有属性';

  constructor() {
    console.log(this.#privateProperty); // 正确访问
  }

  getPrivateProperty() {
    return this.#privateProperty; // 通过方法间接访问
  }
}

const instance = new MyClass();
// console.log(instance.#privateProperty); // 错误,外部无法直接访问
console.log(instance.getPrivateProperty()); // 正确输出

### 静态属性

静态属性是类本身的属性,而不是类的实例的属性。这意味着你可以不通过类的实例来访问这些属性。静态属性使用`static`关键字声明。


class MyClass {
  static staticProperty = '这是一个静态属性';

  constructor() {
    console.log(MyClass.staticProperty); // 可以通过实例访问静态属性
  }
}

console.log(MyClass.staticProperty); // 直接通过类名访问静态属性

const instance = new MyClass();
// instance.staticProperty; // 错误,静态属性不是实例的属性

请注意,私有属性和静态属性的语法是ES2020(及更新版本)的特性,如果你的环境不支持这些特性,你可能需要使用其他方法(如闭包或`WeakMap`)来模拟私有属性,或者使用类的静态方法来模拟静态属性的行为。