如何使用 Private Class Fields 和 Private Methods ES10 的新功能?

ES10 中引入了 Private Class Fields 和 Private Methods 这两个新功能,它们可以帮助开发人员更好地封装和保护类的内部状态和行为。本文将介绍如何使用这两个功能,包括如何定义私有属性和方法、如何调用私有属性和方法,以及它们的使用场景。

定义私有属性和方法

在 ES10 中,可以使用 # 符号来定义私有属性和方法。私有属性和方法只能在类的内部访问,外部无法访问。

class Person {
  #name;
  #age;

  constructor(name, age) {
    this.#name = name;
    this.#age = age;
  }

  #getInfo() {
    return `${this.#name} is ${this.#age} years old.`;
  }

  sayInfo() {
    console.log(this.#getInfo());
  }
}

const person = new Person("John", 20);
person.sayInfo(); // 输出 "John is 20 years old."
console.log(person.#name); // 报错,无法访问私有属性
console.log(person.#getInfo()); // 报错,无法访问私有方法

在上面的代码中,我们使用 # 符号定义了两个私有属性 #name 和 #age,以及一个私有方法 #getInfo。在构造函数中,我们使用 this.#name 和 this.#age 来访问私有属性。在 sayInfo 方法中,我们调用了私有方法 #getInfo。

调用私有属性和方法

在类的内部,可以直接访问私有属性和方法。在类的外部,无法直接访问私有属性和方法,但可以通过公有方法来访问私有属性和方法。

class Person {
  #name;
  #age;

  constructor(name, age) {
    this.#name = name;
    this.#age = age;
  }

  #getInfo() {
    return `${this.#name} is ${this.#age} years old.`;
  }

  sayInfo() {
    console.log(this.#getInfo());
  }

  getName() {
    return this.#name;
  }

  getAge() {
    return this.#age;
  }
}

const person = new Person("John", 20);
person.sayInfo(); // 输出 "John is 20 years old."
console.log(person.getName()); // 输出 "John"
console.log(person.getAge()); // 输出 20

在上面的代码中,我们定义了两个公有方法 getName 和 getAge,它们分别返回私有属性 #name 和 #age 的值。在类的外部,我们可以通过这两个公有方法来访问私有属性 #name 和 #age。

使用场景

Private Class Fields 和 Private Methods 可以帮助开发人员更好地封装和保护类的内部状态和行为,从而提高代码的安全性和可维护性。以下是一些使用场景:

  • 封装类的内部状态和行为,避免外部直接访问和修改类的属性和方法,从而提高代码的安全性和可维护性。
  • 在继承中,私有属性和方法只能在父类中访问,子类无法继承或重写私有属性和方法,从而避免子类破坏父类的封装性。
  • 在模块化开发中,私有属性和方法只能在当前模块中访问,避免外部模块直接访问和修改当前模块的属性和方法,从而提高代码的安全性和可维护性。

总结

Private Class Fields 和 Private Methods 是 ES10 中新增的两个功能,它们可以帮助开发人员更好地封装和保护类的内部状态和行为。在定义私有属性和方法时,需要使用 # 符号来标识。在调用私有属性和方法时,可以通过公有方法来访问私有属性和方法。私有属性和方法的使用场景包括封装类的内部状态和行为、继承中的保护和模块化开发中的封装。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65bbaeb9add4f0e0ff4848c5