Статичні та фабричні методи
Методи та властивості, які не прив'язані до конкретного екземпляра об'єкта, називають «статичними». Їх записують у саму функцію-конструктор.
Статичні властивості
У коді нижче використовуються статичні властивості Article.count та Article.DEFAULT_FORMAT :
Вони зберігають дані, специфічні не одного об'єкта, а всіх статей цілком.
Як правило, це частіше константи, такі як формат за замовчуванням Article.DEFAULT_FORMAT .
Статичні методи
З прикладами статичних методів ми знайомі: це вбудовані методи String.fromCharCode, Date.parse.
Створимо для Article статичний метод Article.showCount() :
Тут Article.count – статична властивість, а Article.showCount – статичний метод.
Звернімо увагу на використання цього у прикладі вище. Незважаючи на те, що змінна та метод – статичні, він все ще корисний. У рядку (1) він дорівнює Article.
Приклад: порівняння об'єктів
Ще один добрий спосіб застосування – порівняння об'єктів.
Наприклад, у нас є об'єкт Journal для журналів. Журнали можна порівнювати – за товщиною, вагою, за іншими параметрами.
Оголосимо «стандартну» функцію порівняння, яка порівнюватиме за датою видання. Ця функція порівняння, природно, не прив'язана до конкретного журналу, але належить до журналів взагалі.
Тому поставимо її як статичний метод Journal.compare :
У прикладі нижче ця функція використовується для пошуку раннього журналу з масиву:
Статичний метод також можна використовувати для функцій, які взагалі не вимагають наявності об'єкта.
Наприклад, метод formatDate(date) можна зробити статичним. Він форматуватиме дату "як це прийнято в журналах", при цьому його можна використовувати в будь-якому місцікоду, не обов'язково створювати журнал.
Фабричні методи
Розглянемо ситуацію, коли об'єкт потрібно створювати у різний спосіб. Наприклад, це реалізовано у вбудованому об'єкті Date. Він по-різному обробляє аргументи різних типів:
- new Date() – створює об'єкт із поточною датою,
- new Date(milliseconds) – створює дату за кількістю мілісекунд milliseconds ,
- new Date(year, month, day . ) – створює дату за компонентами рік, місяць, день…
- new Date(datestring) – читає дату з рядка datestring
"Фабричний статичний метод" - зручна альтернатива такому конструктору. Так називається статичний метод, який служить для створення нових об'єктів (тому і називається «фабричним»).
Приклад вбудованого фабричного методу - String.fromCharCode (code). Цей метод створює рядок із коду символу:
Але рядки – надто простий приклад, подивимося щось складніше.
Допустимо, нам потрібно створювати об'єкти User: анонімні new User() і з даними new User().
Можна, звичайно, створити поліморфну функцію-конструктор
Підхід із використанням фабричних методів був би іншим. Замість аналізу параметрів у конструкторі – робимо два методи: User.createAnonymous і User.createFromData .
Переваги використання фабричних методів:
- Найкраща читаність коду. Як конструктора - замість однієї великої функції кілька маленьких, так і коду, що викликає, - явно видно, що саме створюється.
- Найкращий контроль помилок, т.к. Якщо createFromData нічого не передали, то буде помилка, а поліморфний конструктор створив би анонімного відвідувача.
- Зручна розширюваність. Наприклад, потрібно додати створення адміністратора без аргументів. Фабричний метод зробити легко:User.createAdmin = function() < . >. А для поліморфного конструктора виклик без аргументу створить аноніма, тож потрібно додати параметр – тип відвідувача і ускладнити цим код.
Тому поліморфні конструктори краще використовувати там, де потрібен саме поліморфізм, тобто. коли незрозуміло, якого типу аргумент передадуть і хочеться в одному конструкторі охопити всі варіанти.
А в інших випадках чудова альтернатива – фабричні методи.
Статичні властивості та методи об'єкта зручно застосовувати у таких випадках:
- Загальні дії та підрахунки, що стосуються всіх об'єктів даного типу. У прикладах вище це підрахунок кількості.
- Методи, які не прив'язані до конкретного об'єкта, наприклад, порівняння.
- Допоміжні методи, які корисні поза об'єктом, наприклад, для форматування дати.
- Фабричні методи.
Лічильник об'єктів
Додати в конструктор Article :
- Підрахунок загальної кількості створених об'єктів.
- Запам'ятовування дати останнього створеного об'єкта.
Використовуйте при цьому статичні властивості.