摘要:在本教程中,您将学习 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() 私有静态方法,以在将 firstName 和 lastName 参数分配给相应的私有属性之前验证它们。
总结
- 在方法名前加
#以将其设为私有。 - 私有方法可以在类内部调用,不能从类外部或子类中调用。