В этом руководстве вы узнаете о приватных методах 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
, прежде чем назначать их соответствующим закрытым атрибутам.
Заключение
- Добавьте префикс
#
к имени метода, чтобы сделать его закрытым. - Приватные методы можно вызывать внутри класса, а не снаружи класса или в подклассах.