在本教程中,您将了解 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()
构造函数中的私有静态方法来验证 firstName
和 lastName
参数,然后再将它们分配给相应的私有属性。
结论
- 在方法名称前加上前缀
#
使其私有。 - 私有方法可以在类内部调用,不能从类外部或子类调用。