Приватные методы в JavaScript

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

Заключение

  • Добавьте префикс # к имени метода, чтобы сделать его закрытым.
  • Приватные методы можно вызывать внутри класса, а не снаружи класса или в подклассах.
Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript