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