在本教程中,您将了解 JavaScript 私有方法,包括私有实例方法、私有静态方法和私有的 getter/setter。

JavaScript 私有方法简介

默认情况下,的成员是公开的。ES2020 引入私有成员,包括私有字段和方法。

要将公开方法设为私有,您可以在其名称前加上哈希 #。JavaScript 允许您为实例方法、静态方法getter/setter 定义私有方法。

下面展示如何定义私有实例方法的语法:

class MyClass {
  #privateMethod() {
    //...
  }
}

在此语法中,#privateMethod 是私有实例方法。它只能在 MyClass 内部调用,换句话说,它不能从类外部或者 MyClass 的子类中调用。

要在 MyClass 内部调用 #privateMethod 私有方法,您可以使用关键词 this ,如下所示:

this.#privateMethod();

下面说明定义私有静态方法的语法:

class MyClass {
  static #privateStaticMethod() {
    //...
  }
}

要在 MyClass 内部调用 #privateStaticMethod() 私有静态方法,您可以使用类名而不是 this 关键词:

MyClass.#privateStaticMethod();

下面展示私有 getter/setter 的语法:

class MyClass {
  #field;
  get #myField() {
      return #field;
  }
  set #myField(value){
      #field = value;
  }
}

在此示例中,#myField 是私有的 getter 和 setter 用于对私有字段 #field 的访问 。在实践中,您可以使用私有方法来最小化公开对象的方法。

根据经验,您应该首先将类的所有方法默认设置为私有。然后,只要对象需要使用此方法与其他对象交互,就可以公开此方法。

JavaScript 私有方法示例

在这里,让我们举一些使用私有方法的例子。

私有实例方法

下面说明如何Person使用私有实例方法定义类:

class Person {
  #firstName;
  #lastName;
  constructor(firstName, lastName) {
    this.#firstName = firstName;
    this.#lastName = lastName;
  }
  getFullName(format = true) {
    return format ? this.#firstLast() : this.#lastFirst();
  }

  #firstLast() {
    return `${this.#firstName} ${this.#lastName}`;
  }
  #lastFirst() {
    return `${this.#lastName}, ${this.#firstName}`;
  }
}

let person = new Person('John', 'Doe');
console.log(person.getFullName());

输出:

John Doe

在这个例子中:

首先,在 Person 类定义两个私有字段 #firstName#lastName

其次,定义私有方法 #firstLast()#lastFirst()。这些方法以不同的格式返回全名。

第三,定义返回个人的全名的公开实例方法 getFullName()getFullName() 方法调用私有方法 #firstLast()#lastFirst() 返回全名。

最后,创建 person 对象并将全名输出到控制台。

私有静态方法

下面将私有静态方法 #validate() 添加到 Person 类:

class Person {
  #firstName;
  #lastName;
  constructor(firstName, lastName) {
    this.#firstName = Person.#validate(firstName);
    this.#lastName = Person.#validate(lastName);
  }
  getFullName(format = true) {
    return format ? this.#firstLast() : this.#lastFirst();
  }
  static #validate(name) {
    if (typeof name === 'string') {
      let str = name.trim();
      if (str.length === 3) {
        return str;
      }
    }
    throw 'The name must be a string with at least 3 characters';
  }

  #firstLast() {
    return `${this.#firstName} ${this.#lastName}`;
  }
  #lastFirst() {
    return `${this.#lastName}, ${this.#firstName}`;
  }
}

let person = new Person('John', 'Doe');
console.log(person.getFullName());

代码如何运行。

首先,定义一个静态方法 #validate(),如果它是至少包含三个字符的字符串,则返回一个值。否则该方法会引发异常。

其次,调用 #validate() 构造函数中的私有静态方法来验证 firstNamelastName 参数,然后再将它们分配给相应的私有属性。

结论

  • 在方法名称前加上前缀 # 使其私有。
  • 私有方法可以在类内部调用,不能从类外部或子类调用。