В этом видео я познакомлю вас с ещё одним подходом к конструированию объектов.
Мы познакомились уже с классическим подходом, и для этого нам понадобилось
изучить достаточно много нового, познакомиться с оператором new,
понять, как работает специальное поле prototype у конструкторов,
и изучить работу метода create.
Но для конструирования объектов и построения связей между ними
достаточно лишь использовать только метод create.
И сейчас я вам покажу как.
Давайте снова попробуем создать конструктор для студентов.
Для этого нам вновь понадобится ряд прототипов, выстроенных в цепочку.
На этот раз мы воспользуемся только методом create и обычными объектами,
так как любой прототип по факту — это обычный объект.
Итак, для начала нам понадобится прототип личности.
Создадим простой объект personProto и добавим туда метод getName,
который будет возвращать имя нашей личности.
На основе этого прототипа создадим более специфичный прототип уже для студентов.
При помощи метода create мы свяжем два этих прототипа в цепочку.
Далее мы можем расширить наш прототип для студентов уже
специфичными для студентов методами, например, методом sleep.
Далее на основе прототипа для студентов мы уже будем создавать,
собственно, студентов.
Для этого снова воспользуемся методом create.
Таким образом,
благодаря этому методу мы встроим нашего студента в цепочку прототипов.
И далее всё, что нам останется, это только дополнить нашего студента полями,
которые необходимы каждому конкретному студенту с конкретными значениями.
В данном случае мы присваиваем нашему студенту в поле name имя.
Зовут его billy.
Благодаря такому подходу нам понадобилось значительно меньше строчек кода, чем в
классическом, чтобы научить нашу программу создавать новые объекты студентов.
Для создания нового студента нам необходимо написать всего две строчки.
Но и здесь мы можем произвести улучшение и сократить создание
объекта нового студента до одной строки.
Для этого нам понадобится ещё одна возможность метода create,
о которой я вам не рассказывал ранее,
а именно — данный метод принимает не один аргумент, а два.
В качестве второго аргумента вы можете передать необходимые
поля с их начальными значениями и характеристиками,
которые вы хотите видеть при создании объекта в итоговом объекте.
Посмотрим, каким образом мы можем использовать данную возможность.
Для того чтобы создавать наших студентов в одну строку,
нам понадобится дополнительная функция-помощник,
назовём её create и положим в наш прототип для студентов.
Иногда такие функции называют фабриками — фабриками объектов.
Данная функция будет на вход принимать в себя имя студента,
а внутри себя вызывать метод Object.create, в качестве контекста
передавать this и в качестве второго аргумента передавать набор полей,
которые мы хотим видеть у студента, а именно: мы хотим у него видеть поле name,
и мы сразу заполняем его тем, что нам приходит в фабрику.
Таким образом мы можем создавать новых студентов в одну строчку,
как и при классическом подходе при помощи оператора new.
В данном случае мы просто вызываем наш метод create,
который лежит в прототипе студента,
передаём туда имя и получаем новый объект, нового студента с этим именем.
Какой же подход предпочесть?
Первый, классический, при помощи оператора new или второй, при помощи метода create?
Единого мнения, какой из этих подходов лучше, у разработчиков нет.
Некоторым нравится первый подход,
так как он напоминает им способ создания объектов в других языках программирования.
Вторым нравится Object.create,
так как он предлагает более лаконичный и простой подход к созданию объектов.
Дискуссии не утихают до сих пор,
и масло в огонь этих дискуссий подливает новая версия спецификаций,
которая вводит новую синтаксическую конструкцию, а именно «классы».
И вместо функций-конструкторов мы можем определить
класс и на основе этого класса создавать новые объекты.
Но я не зря обернул «классы» в двойные кавычки,
так как под капотом это не более, чем обычные функции-конструкторы.
У них также есть специальное поле prototype —
хранилище для прототипов, для всех вновь создаваемых этим классом объектов.
Также если мы посмотрим тип классов, то мы увидим, что это обычная функция.
Таким образом, дискуссия трансформировалась в
другую: что выбрать, классы или метод Object.create?
Наиболее полно её раскрыл в статье разработчик Eric Elliott,
и я рекомендую вам всем ознакомиться с ней.
Итак, на этой неделе мы с вами познакомились с конструкторами
и разобрали несколько способов конструирования объектов в JavaScript.