В этом видео мы с вами попробуем привязать ко всем вновь создаваемым объектам при помощи конструкторов целые цепочки прототипов. У нас есть некоторый конструктор студентов, который принимает на вход имя студента и записывает его в поле name. А также хранилище, в поле .prototype нашего конструктора мы поместили объект, который хотим видеть в качестве прототипа для всех вновь создаваемых студентов. Там сейчас один метод – sleep. Допустим, у нас есть более абстрактный конструктор, который также имеет хранилище и в котором расположен другой метод – getName, который возвращает имя личности. В данном случае нам бы не хотелось дублировать реализацию этого метода в хранилище конструктора студентов. И хотелось бы воспользоваться этим методом из хранилища другого конструктора – конструктора Person. Для этого мы можем пойти самым простым путем, и хранилище конструктора студентов сделать на основе хранилища конструктора Person. Для этого мы просто присваиваем в специальное поле prototype ссылку на хранилище конструктора Person. Далее, мы можем расширить наше хранилище для студентов более специфичным для них методом – методом sleep. Итак, мы можем создавать теперь новых студентов, которые, безусловно, будут иметь доступ к методу sleep из своего хранилища, ну и также будут иметь доступ к методу getName, которое изначально было в хранилище другого конструктора – конструктора Person. Данный способ имеет подводный камень. Если мы в своей программе попробуем использовать объекты другого типа, создадим для них конструктор и в хранилище этого конструктора запишем ссылку на то же самое хранилище, которое связано с конструктором Person, безусловно, наш новый объект – преподаватель – получит доступ к методам из этого хранилища Person. Но мы с удивлением обнаружим, что преподаватель получит доступ и к методам, которые мы ранее определили только для студентов, например к методу sleep. Не очень здорово, если преподаватель преснет прямо на лекции. Это происходит потому, что все три этих хранилища хранят сейчас ссылки на один и тот же объект, и наша цепочка прототипов выглядит примерно так. Мы можем добавлять какие-то методы специально для студентов, но они будут появляться и во всех объектах, созданных на основе конструктора Person. Это нежелательное поведение и нам бы хотелось, чтобы цепочка выглядела примерно так. Что бы мы могли безопасно добавлять методы, специфичные для студентов, не затрагивая хранилища более высокого уровня. Решить эту проблему нам поможет специальный метод create. Вместо обычного присваивания, мы в хранилище для конструктора студентов будем записывать объект, который нам этот метод возвращает. В качестве аргумента, напомню, этот метод принимает в себя объект, который мы хотим видеть в качестве прототипа для всех возвращаемых им объектов. Такой же трюк мы можем проделать и с конструктором преподавателя. Попробуем теперь создать нового преподавателя и вызвать у него метод, который мы определили только для студентов. Благодаря методу create, мы увидим, что преподаватели не будут иметь доступ к методам, которые мы определили только для студентов. Этот метод помог нам построить правильные линейные цепочки прототипов. Давайте разберем подробней, как этот метод работает внутри и почему он нам помог. Попробуем разобраться, как работает метод create, на яблоках. Итак, наш метод создает пустой объект, прототипом которого становится объект, переданный первым аргументом. Допустим, у нас есть прототип для фруктов, которые хранит единственное поле, которое говорит нам о том, что все фрукты полезные. И на основе этого прототипа фруктов мы будем создавать новые фрукты при помощи метода create, передавая в качестве аргумента наш прототип. Так мы можем создать яблоко и проверить, что оно действительно полезное, несмотря на то, что этого поля у самого яблока нет. Оно есть у его прототипа. Внутри метод create устроен достаточно просто. Он создает простейшие конструкторы из возможных, а именно: пустую функцию. Далее, в хранилище этого конструктора он записывает ссылку на тот объект, который мы передаем в качестве первого аргумента, тот объект, который хотим видеть в качестве прототипа для всех создаваемых объектов. Далее, он при помощи этого конструктора создает новый объект и возвращает его. Таким образом, все вновь создаваемые объекты будут иметь в качестве прототипа тот объект, который мы передаем первым аргументом. В метод create мы можем передавать не только объекты, но и, например, значение null. В этом случае мы создадим объект, в качестве прототипа которого не будет выступать ни один из объектов, даже глобальный прототип для всех объектов. И мы не получим доступ к методам из этого глобального прототипа, а получим объект с самой короткой цепочкой прототипов на свете. Теперь понятно, каким образом метод create помогает нам связать два хранилища разных конструкторов так, чтобы они не ссылались на один и тот же объект. И хранилище для конструктора студентов будет представлять из себя отдельный объект, но во внутреннем поле prototype которого лежит ссылка на другое хранилище – хранилище конструктора Person. Далее мы можем расширить хранилище для студентов специфичными для них методами. И здесь мы допустили ту же самую ошибку, что и ранее. Мы полностью перезаписали хранилище студентов и забыли о поле конструктора. Давайте его вернем. Достаточно просто присвоить в него ссылку на функцию. Итоговое решение нашей задачи выглядит примерно так. Благодаря этому видео, мы научились с вами создавать конструкторы объектов и автоматически привязывать к ним целые цепочки прототипов.