В этом руководстве вы узнаете о приватных методах JavaScript, включая методы экземпляра, статические методы и геттер/сеттер.
По умолчанию члены класса являются общедоступными. ES2020 представила частные члены, которые включают приватные поля и методы JavaScript.
Чтобы сделать общедоступный метод закрытым, вы добавляете к его имени префикс #. JavaScript позволяет вам определять приватные методы для методов экземпляра, статических методов и геттеров/сеттеров.
Ниже показан синтаксис определения частного метода экземпляра:
class MyClass {#privateMethod() {
//...
}
}В этом синтаксисе #privateMethod является приватным методом экземпляра. Его можно вызывать только внутри MyClass. Другими словами, его нельзя вызывать извне класса или из подклассов MyClass.
Чтобы вызвать #privateMethod внутри MyClass, вы используете ключевое слово this следующим образом:
this.#privateMethod();
Ниже показан синтаксис определения закрытого статического метода:
class MyClass {
static#privateStaticMethod() {
//...
}
}Чтобы вызвать #privateStaticMethod() внутри MyClass, вы используете имя класса вместо ключевого слова this :
MyClass.#privateStaticMethod();
Ниже показан синтаксис частных геттеров/сеттеров:
class MyClass {#field;
get#myField() {
return#field;
}
set#myField(value) {#field = value;
}
}В этом примере #myField — это приватный геттер и сеттер, которые обеспечивают доступ к частному полю #field.
На практике вы используете закрытые методы, чтобы свести к минимуму количество методов, предоставляемых объектом.
Как правило, вы должны сначала сделать все методы класса закрытыми по умолчанию. И затем вы делаете метод общедоступным всякий раз, когда объект должен использовать этот метод для взаимодействия с другими объектами.
Примеры
Давайте рассмотрим несколько примеров использования приватных методов.
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());Выход:
John Doe
В этом примере:
Во-первых, определите два закрытых поля #firstName и #lastName в теле класса Person.
Во-вторых, определите приватные методы #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());Как это работает:
- Во-первых, определите статический метод
#validate(), который возвращает значение, если это строка, состоящая не менее чем из трех символов. В противном случае метод вызывает исключение. - Во-вторых, вызовите частный статический метод
#validate()в конструкторе, чтобы проверить аргументыfirstNameиlastName, прежде чем назначать их соответствующим закрытым атрибутам.
Заключение
- Добавьте префикс
#к имени метода, чтобы сделать его закрытым. - Приватные методы можно вызывать внутри класса, а не снаружи класса или в подклассах.
