JavaScript 私有方法

摘要:在本教程中,您将学习 JavaScript 私有方法,包括私有实例方法、私有静态方法和私有 getter/setter。

JavaScript 私有方法介绍

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

要将公共方法设为私有,请在其名称前加一个井号 #。JavaScript 允许您为实例方法、静态方法getter/setter 定义私有方法。

以下显示了定义私有实例方法的语法

class MyClass {
  #privateMethod() {
    //...
  }
}Code language: JavaScript (javascript)

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

要在 MyClass 内部调用 #privateMethod,请使用 this 关键字,如下所示

this.#privateMethod();Code language: JavaScript (javascript)

以下说明了定义私有静态方法的语法

class MyClass {
  static #privateStaticMethod() {
    //...
  }
}Code language: JavaScript (javascript)

要在 MyClass 内部调用 #privateStaticMethod(),请使用类名而不是 this 关键字

MyClass.#privateStaticMethod();Code language: JavaScript (javascript)

以下显示了私有 getter/setter 的语法

class MyClass {
  #field;
  get #myField() {
      return #field;
  }
  set #myField(value){
      #field = value;
  }
}Code language: JavaScript (javascript)

在此示例中,#myField 是私有 getter 和 setter,它提供对私有字段 #field 的访问。

在实践中,您可以使用私有方法来最小化对象公开的方法数量。

作为经验法则,您应该首先将所有类方法默认为私有。然后,每当对象需要使用该方法与其他对象交互时,您就将其设为公共方法。

JavaScript 私有方法示例

让我们看一些使用私有方法的示例

1) 私有实例方法示例

以下说明了如何使用私有实例方法定义 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());Code language: JavaScript (javascript)

输出

John DoeCode language: JavaScript (javascript)

在此示例中

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

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

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

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

2) 私有静态方法示例

以下将 #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());Code language: JavaScript (javascript)

工作原理。

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

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

总结

  • 在方法名前加 # 以将其设为私有。
  • 私有方法可以在类内部调用,不能从类外部或子类中调用。
本教程是否有帮助?