Прототип это в информатике кратко

Обновлено: 04.07.2024

Что такое прототип? Прототип- это модель, позволяющая продемонстрировать интерфейс, поведение проектируемой системы или архитектуру. Сбор и уточнение требований прототипированием гораздо эффективнее проводить после выявления первичных требований любым другим способом.

Важно понимать, прототип должен отражать реализацию идей, заявленных ранее при первичном обсуждении. Это спровоцирует всех участников активнее работать над новыми требованиями к продукту.

Прототипы могут быть самыми разными, все зависит от ваших целей и задач.

Вы можете нарисовать пользовательский интерфейс приложения на листке бумаги.

Сделать тоже самое в виде презентации или же написать работающий прототип в среде разработки.

Прототип может быть статическим , показывающим положение элементов в интерфейсе или структуры данных.

Динамическим - с возможностью демонстрации поведения системы по наступлению определенных событий.

Интерактивным - позволяющим пользователям и участникам заинтересованных сторон выполнять реальные действия так, как это будет работать в разрабатываемой системе.

Для максимально эффективного восприятия прототипов пользователями, необходимо использовать только реальные данные, если есть такая возможность. Или приближенные к реальным.

В области разработки прототипов существует огромное количество инструментов, эта тема заслуживает отдельной статьи.

Стоит отметить и некоторые минусы данного способа сбора требований:

1. Большие трудозатраты - в случае, если обновленный интерфейс не дает экономии по времени разработки.

2. Есть вероятность, что представители заинтересованных сторон будут смещать фокус внимания с действительно важных вопросов на обсуждение красоты новых элементов.

В целом, прототипирование очень полезный метод. Эффективность метода существенно возрастает, если Аналитик имеет достаточный багаж знаний в области UX/UI - дизайна .

В статье расскажем, зачем разработчикам прототипы, какие задачи они решают и поделимся подборкой популярных решений. В конце вас ждут советы, которые позволят вывести работу с сайтами на новый уровень.

Что такое прототипы

Далеко не все разработчики уделяют внимание прототипам. Многие специалисты считают, что им незачем тратить время на изучение возможностей сервиса прототипирования. Внешний вид — ответственность дизайнера, а разработчик просто превращает готовый макет в интерфейс.


Представьте, что хотите построить дом и рассчитываете быстро завершить проект. Находите бригаду опытных строителей, ставите перед ними задачу и ждете первых результатов.

Через время едете проверять состояние объекта и оказывается, что строители действовали по своему усмотрению. Вместо двух этажей построили один и сильно отклонились от первоначальной идеи.

Аналогичные проблемы возникают, когда сайт создается без прототипа и технического задания. Представления заказчика, дизайнера и программиста сильно отличаются, поэтому конечный вид продукта может быть абсолютно не таким, как планировалось.

Создавать интерфейс сайта или приложения без технического результата и закрепленной схемы внешнего вида, всё равно, что путешествовать по стране без знания местного языка. Добраться до пункта назначения максимально сложно, если под рукой нет навигатора или человека, который может спросить дорогу у жителей.

Никто не говорит, что для создания сайта обязательно тратить деньги и время на прототип. Это рекомендуемый базовый инструмент, который помогает закрепить требования заказчика в понятной форме. Он выступает в роли карты для дизайнера и программиста, а клиент уверен, что отклонений от плана не будет.


Если хотите работать с прототипами и готовы потратить время, чтобы научиться их создавать, важно разбираться в фундаментальных понятиях. Прототипы часто путают с мокапами, хотя они отражают разные уровни детализации интерфейса.

В среде отечественных дизайнеров прототипами принято называть вайрфреймы. Это черно-белые наброски будущего продукта, которые отражают исключительно структуру. На этапе прототипа внешний вид можно менять, а когда работа над интерфейсом завершена, любые правки замедлят реализацию проекта.

Одно из главных преимуществ прототипов — поиск недостатков. В процессе анализа они часто всплывают на поверхность и это позволяет защитить продукт от критических ошибок на этапе релиза.

Представьте, что дизайнер и клиент вместе создали прототип, а дальше процесс пошёл по цепочке. Разработали макет, передали задачу верстальщику, затем подключился разработчик для натяжки на CMS.

После завершения работы над сайтом выяснилось, что несколько блоков созданы с ошибками и необходимо срочно внести изменения, чтобы защититься от негативного пользовательского опыта. Если бы команда потратила время на анализ прототипа, можно было сэкономить время.

Прототип не является панацеей, но здорово помогает всем членам рабочего процесса. Если планируется реализация большого проекта на десятки страниц, создание черновика может затянуться надолго, но это нельзя назвать лишней работой.


Разработчики могут сказать, что они не должны заниматься прототипами и находить недочеты в структуре. Их обязанности заканчиваются на коде, а остальные задачи решают другие специалисты.

С этим доводом можно частично согласиться, но если разработчик рассчитывает на постоянной основе заниматься разработкой интерфейсов, время на освоение инструментов прототипирования не будет потрачено зря.

Допустим, предпринимателю нужен сайт пекарни, но у него нет знакомых дизайнеров. Он находит разработчика в своём городе, а тот предлагает ему сначала обратиться к дизайнеру. Большинство клиентов после такой обратной связи пойдут за помощью в веб-студию, которая избавить их от проблем.

Конечно, если программист дорос до определенного уровня и очередь у него расписана на несколько месяцев вперед, отказывать новым клиентам можно. Это не ударит по репутации и никак не повлияет на доход.

А вот специалистам, которые только хотят выйти на рынок разработки, надо подстраиваться под каждого клиента. Если после созвона пришлёте ему прототип главной страницы, лояльность потенциального заказчика сильно увеличится. Поддерживайте связь на прежнем уровне и сможете закрыть первый проект.

Какие задачи они решают в веб-разработке

Мы уже выяснили, что прототип — черновой вариант будущего интерфейса, который выступает в роли навигатора для всех участников процесса разработки. Дизайнер понимает, в каком направлении двигаться. Разработчик может свериться с прототипом на любом этапе. А клиент будет уверен, что никто не отступит от утверждённого плана.


Техническое задание — это хорошо, но оно не закрывает все потребности дизайнера. Слова в документе можно по-разному интерпретировать, а когда есть утвержденный внешний вид, работать гораздо попроще.

Какие задачи решают прототипы:

  1. Закрепление договорённостей. Если работа осуществляется по договору и к нему прикреплено техническое задание, прототип станет границей, за которую нельзя выходить. Он поможет всем участникам процесса не сбиться с пути.
  2. Формирование обратной связи. В ходе анализа прототипа часто находятся критические ошибки, которые должны быть исправлены до создания макета.
  3. Совершенствование концепта. Чем больше итераций доработки прототипа, тем выше уровень цифрового продукта на выходе.
  4. Экономия времени. Качественный прототип позволит быстро перейти к следующему этапу разработки. У заказчика будет меньше правок, а дизайнер не отвлекается на внесение изменений.
  5. Визуализация идей. Образы в сознании разных участников процесса могут сильно отличаться, а созданный концепт позволит привести их к общему знаменателю.
  6. Отладка рабочего процесса. После создания прототипа начинается проектирование UI, затем HTML-верстка, а в конце интеграция в CMS.

Создание прототипов — настоящее искусство, которое сложно освоить в совершенстве за несколько дней. Новичкам может показаться, что для решения этой задачи не нужны творческие способности. Работаешь по шаблону и быстро получаешь нужный результат.

Инструменты прототипирования помогают быстрее создавать наброски высокого качества, но они становятся полезными только в умелых руках. Если разработчик в первый раз открыл интерфейс сервиса, вряд ли у него получится создать качественный прототип за пару часов.

Поэтому важно уделять время постепенному освоению инструментов, которые помогают создавать прототипы с высокой детализацией. Конечно, если разработчик хочет заниматься этой задачей. Если его привлекает только код, тратить время не стоит.

Почему ТЗ не заменяет прототип

Мы уже частично ответили на этот вопрос, но так как он очень важен, необходимо провести глубокий анализ. Постараемся сделать так, чтобы новички поняли принципиальную разницу и не попали в ловушку распространённых мифов.

Прототип и техническое задание — два компонента, которые связаны между собой, но выполняют немного разные задачи. Прототип позволяет зафиксировать внешний вид, а техническое задание описывает важные нюансы.


Если вернуться к примеру со зданием, то прототип — чертеж. Он описывает расположение комнат, особенности архитектуры и другие параметры, которые сильно влияют на конечный результат.

Техническое задание — приложение к проекту, описывающее требования к зданию. В документе может быть указан дизайн комнат, требования к стилю, вместимость гаражей и остальные нюансы.

Если провести другую аналогию, то прототип — карта для прохождения маршрута, а ТЗ — правила игры и подсказки, которые помогают быстро дойти до финальной точки. Каждый компонент по отдельности полезен, но вместе они позволяют сократить время решения задачи в несколько раз.

Лучше, если прототип будет делать специалист, который знает особенности продукта и компании. Это гарантирует максимально быстрое и точное попадание в потребности целевой аудитории и требования заказчика.

Можно делегировать задачу внешнему подрядчику, но тогда нет гарантий, что конечный результат будет устраивать все стороны. Ему однозначно придется потратить время на анализ ЦА и погружение в особенности продукта.


Как разработчику научиться создавать прототипы

Если твёрдо решили, что хотите освоить инструменты прототипирования, приготовьтесь к тому, что на это уйдет не один день. Это не рутинная работа, а творческий процесс, который отнимает много сил и времени.

Даже если заказчик подробно изложил требования, их реализация может стать сложной задачей. Длительность разработки прототипа зависит от особенностей проекта. Простенький лендинг собирается за несколько часов, а корпоративный портал превращается в многочасовую задачу.

Чтобы научиться создавать прототипы, необязательно проходить курсы по дизайну. Тем более что инфопродуктов по этой теме крайне мало. Самый простой путь — просмотр видеоуроков по популярным сервисам и практический опыт.

Лучше начинать с простых задач и постепенно повышать уровень сложности. Если сразу возьметесь за проект на 10-15 страниц клиент будет долго ждать конечного результата.

Тем, кто считает, что прототипы — лишняя трата времени, проще заниматься написанием кода и не переключать внимание на другие задачи. Этот путь нельзя назвать единственно правильным, но он точно является приоритетным для разработчиков в чистом виде.

Прототипирование может стать хорошей разгрузкой для специалистов, которые целыми днями сидят в редакторе кода. Смещение фокуса на другие задачи помогает защититься от выгорания. Рано или поздно любые проекты начинают казаться рутинными и работа приносит меньше удовольствия.


Клиенты часто сами не знают, какое визуальное решение окажется правильным, поэтому они доверяют задачу профессионалам. Разработчику, который решил освоиться в новой нише, придётся не просто работать по готовому плану, а проявить творческие способности.

Остаётся только выбрать подходящий инструмент прототипирования, освоить его хотя бы на базовом уровне и предоставлять клиентам комплексные услуги. Далеко не все разработчики могут обеспечить такой подход к работе, поэтому можно использовать создание прототипов как преимущество перед конкурентами.

Сервисы для создания прототипов

Принцип работы сервисов прототипирования одинаковый, но подход и особенности взаимодействия с инструментами отличаются. Лучше выбрать один или несколько удобных решений в зависимости от личных ощущений и уровня проектов, с которыми планируете работать.

Собрали 5 популярных сервисов, которые используются для создания прототипов. Освоить их может человек с любым уровнем знаний. Для этого не нужно знать программирование или Photoshop в совершенстве.

Wireframe.cc

Сервис отличается максимально низким порогом входа. На стартовой странице доступен холст, который можно заполнить контентом. После регистрации открывается возможность сохранить проект и настроить доступ.

В интерфейсе реализовано переключение на десктопный и мобильный холст. Это помогает быстро находить различия между разными версиями прототипа и устранять их в случае необходимости.

После создания учётной записи активируется бесплатный доступ на 7 дней. После окончания пробного периода надо пополнить счёт, чтобы продолжить использование Wireframe.cc.


NinjaMock

Сервис отличается простым дизайном и позволяет создавать прототипы с низкой детализацией. Подходит для небольших проектов, где разработчики не предъявляют высокие требования к качеству интерфейса.

Созданный прототип выглядит не слишком презентабельно, но его достаточно для базового понимания будущего интерфейса. Лучше заранее показать клиенту примеры проектов из этого сервиса, чтобы защититься от потенциальных проблем.

Бумажный стиль прототипа, который получается в NinjaMock, нельзя назвать некачественным. Он скорее специфический, поэтому подходит не для всех проектов и теряет статус универсального.


Moqups

Пожалуй, один из самых мощных инструментов прототипирования, который давно на рынке и успел завоевать популярность среди дизайнеров и специалистов другого профиля. Отличается широкими возможностями и постоянным развитием.

Прототипы, которые созданы в этом сервисе, выглядят премиально. Концепты можно показывать заказчикам любого уровня: от небольших компаний до крупных корпораций. И все клиенты останутся довольны конечным результатом, если были учтены их требования.

В сервисе доступны шаблоны сайтов разного формата. Можно взять готовый шаблон и создать свой проект. Это позволяет здорово экономить время и избавляет от необходимость проектировать структуру с нуля.


Figma

Сервис отличается наличием большого количества плагинов, которые позволяют автоматизировать стандартные задачи и постоянным совершенствованием возможностей. В отличие от конкурентов, Figma не ограничивает свободу пользователей без платной подписки.

Ещё одно преимущество — нативный интерфейс. Освоить Фигму можно за пару дней и использовать её для создания визуальных решений любого уровня. Многие предприниматели знакомы с этим инструментом и умеют с ним работать.


Axure RP

Мощная программа для создания прототипов, которая отличается широкими возможностями и высокой стоимостью. Axure легко конкурируют с облачными аналогами, но подходит тем, кто предпочитает работать не в браузере, а на рабочем столе.

Одно из главных преимуществ софта в том, что можно создавать проекты без интернета. Как только подключение будет восстановлено, появится возможность поделиться результатом с коллегами или заказчиком.

Стоимость тарифных планов Axure довольно высокая, но если работать с программой постоянно, расходы окупятся. Если не уверены, что софт подойдет для решения ваших задач, протестируйте его возможности в течение 30 дней.

Выбор инструмента прототипирования должен основываться не только на цене. Большинство полезных сервисов и программ распространяются на платной основе. Покупка платного тарифа или расширенной версии гарантирует приоритетную поддержку и постоянное обновление.


Советы по работе с прототипами

Разработчики не часто решают связать профессиональную деятельность с прототипами, но если постепенно пришли к этому решению и оно кажется логичным, уверенно двигайтесь в этом направлении.

Подготовили советы, которые помогут быстро освоить новый инструмент и презентовать свои навыки заказчикам. Используйте их, чтобы быстро изменить рабочий процесс и извлечь из этого выгоду:

  1. Выберите подходящий сервис. Работать с облачными платформами удобно, потому что они обеспечивают настраиваемый гостевой доступ. Можно настроить права пользователей и члены команды смогут вносить правки, а заказчики — отслеживать процесс работы в режиме реального времени.
  2. Не торопитесь. Не говорите клиентам, что сможете легко сделать прототип, если нет уверенности в своих силах. Получите как можно больше опыта, а затем добавляйте в список новую услугу.
  3. Объясняйте пользу клиентам. Многие сомневаются в целесообразности создания прототипа. Убедите заказчика, что это не бесполезная трата времени, а залог успеха будущего продукта.
  4. Оптимизируйте процессы. Автоматизируйте рутинные задачи, на которых можно сэкономить время. Узнать базовые требования клиентов поможет бриф, а примеры сайтов конкурентов раскроют предпочтения в дизайне.
  5. Улучшайте качество продукта. Создание прототипов с высокой детализацией требует мастерства, но это позволит увеличить стоимость услуги.

Надеемся, что смогли убедить в необходимости близкого знакомства с прототипами. Этот полезный навык точно не будет лишним и может пригодиться в самый неожиданный момент.

Прототипы - это механизм, с помощью которого объекты JavaScript наследуют свойства друг от друга. В этой статье мы объясним, как работают цепочки прототипов, и рассмотрим, как свойство prototype можно использовать для добавления методов к существующим конструкторам.

Базовая компьютерная грамотность, базовое понимание HTML и CSS, знакомство с основами JavaScript (см. Первые шаги и Строительные блоки) и основы OOJS (см. Введение в объекты).

Понять прототипы объектов JavaScript, как работают прототипные цепочки и как добавить новые методы в prototype свойство.

Язык основанный на прототипах?

JavaScript часто описывают как язык прототипного наследования — каждый объект, имеет объект-прототип, который выступает как шаблон, от которого объект наследует методы и свойства. Объект-прототип так же может иметь свой прототип и наследовать его свойства и методы и так далее. Это часто называется цепочкой прототипов и объясняет почему одним объектам доступны свойства и методы которые определены в других объектах.

Точнее, свойства и методы определяются в свойстве prototype функции-конструктора объектов, а не в самих объектах.

В JavaScript создаётся связь между экземпляром объекта и его прототипом (свойство __proto__ , которое является производным от свойства prototype конструктора), а свойства и методы обнаруживаются при переходе по цепочке прототипов.

Примечание: Важно понимать, что существует различие между прототипом объекта (который доступен через Object.getPrototypeOf(obj) или через устаревшее свойство __proto__ ) и свойством prototype в функциях-конструкторах. Первое свойство является свойством каждого экземпляра, а второе - свойством конструктора. То есть Object.getPrototypeOf(new Foobar()) относится к тому же объекту, что и Foobar.prototype .

Давайте посмотрим на пример, чтобы стало понятнее.

Понимание прототипа объектов

Вернёмся к примеру, когда мы закончили писать наш конструктор Person() - загрузите пример в свой браузер. Если у вас ещё нет работы от последней статьи, используйте наш пример oojs-class-further-exercises.html (см. Также исходный код).

В этом примере мы определили конструктору функцию, например:

Затем мы создаём экземпляр объекта следующим образом:


В этом списке вы увидите элементы, определённые в конструкторе person 1 — Person() — name , age , gender , interests , bio , и greeting . Однако вы также увидите некоторые другие элементы — watch , valueOf и т. д. — они определены в объекте прототипа Person (), который является Object .


Итак, что произойдёт, если вы вызываете метод в person1 , который фактически определён в Object ? Например:

Этот метод — Object.valueOf() наследуется person1 , потому что его конструктором является Person() , а прототипом Person() является Object() . valueOf() возвращает значение вызываемого объекта — попробуйте и убедитесь! В этом случае происходит следующее:

  • Сначала браузер проверяет, имеет ли объект person1 доступный в нем метод valueOf() , как определено в его конструкторе Person() .
  • Это не так, поэтому следующим шагом браузер проверяет, имеет ли прототип объекта ( Object() ) конструктора Person() доступный в нем метод valueOf() . Так оно и есть, поэтому он вызывается, и все хорошо!

Примечание: Мы хотим повторить, что методы и свойства не копируются из одного объекта в другой в цепочке прототипов - к ним обращаются, поднимаясь по цепочке, как описано выше.

С ECMAScript 2015 вы можете косвенно обращаться к объекту прототипа объекта Object.getPrototypeOf (obj) .

Свойство prototype: Где определены унаследованные экземпляры

Итак, где определены наследуемые свойства и методы? Если вы посмотрите на страницу со ссылкой Object , вы увидите в левой части большое количество свойств и методов - это намного больше, чем количество унаследованных членов, доступных для объекта person1 . Некоторые из них унаследованы, а некоторые нет - почему это?

Как упоминалось выше, наследованные свойства это те, что определены в свойстве prototype (вы можете называть это подпространством имён), то есть те, которые начинаются с Object.prototype. , а не те, которые начинаются с простого Object . Значение свойства prototype - это объект, который в основном представляет собой контейнер для хранения свойств и методов, которые мы хотим наследовать объектами, расположенными дальше по цепочке прототипов.

Таким образом Object.prototype.watch() , Object.prototype.valueOf() и т. д. доступны для любых типов объектов, которые наследуются от Object.prototype , включая новые экземпляры объектов, созданные из конструктора Person() .

Object.is() , Object.keys() и другие члены, не определённые в контейнере prototype , не наследуются экземплярами объектов или типами объектов, которые наследуются от Object.prototype . Это методы / свойства, доступные только в конструкторе Object() .

Примечание: Это кажется странным - как у вас есть метод, определённый для конструктора, который сам по себе является функцией? Ну, функция также является типом объекта - см. Ссылку на конструктор Function() , если вы нам не верите.

  1. Вы можете проверить существующие свойства прототипа для себя - вернитесь к нашему предыдущему примеру и попробуйте ввести следующее в консоль JavaScript:

Вы увидите большое количество методов, определённых для свойства prototype Object 'а , которые затем доступны для объектов, которые наследуются от Object , как показано выше.

Вы увидите другие примеры наследования цепочек прототипов по всему JavaScript - попробуйте найти методы и свойства, определённые на прототипе глобальных объектов String , Date , Number и Array , например. Все они имеют несколько элементов, определённых на их прототипе, поэтому, например, когда вы создаёте строку, вот так:

В myString сразу есть множество полезных методов, таких как split() , indexOf() , replace() и т. д.

Важно: Свойство prototype является одной из наиболее противоречивых названий частей JavaScript - вы можете подумать, что this указывает на объект прототипа текущего объекта, но это не так (это внутренний объект, к которому можно получить доступ __proto__ , помните ?). prototype вместо этого - свойство, содержащее объект, на котором вы определяете членов, которые вы хотите наследовать.

Снова create()

Ранее мы показали, как метод Object.create() может использоваться для создания нового экземпляра объекта.

    Например, попробуйте это в консоли JavaScript предыдущего примера:

Это вернёт объект person1 .

Свойство constructor

Каждая функция-конструктор имеет свойство prototype , значением которого является объект, содержащий свойство constructor . Это свойство constructor указывает на исходную функцию-конструктор. Как вы увидите в следующем разделе, свойства, определённые в свойстве Person.prototype (или в общем случае в качестве свойства прототипа функции конструктора, который является объектом, как указано в предыдущем разделе) становятся доступными для всех объектов экземпляра, созданных с помощью конструктор Person() . Следовательно, свойство конструктора также доступно для объектов person1 и person2 .

    Например, попробуйте эти команды в консоли:

Они должны возвращать конструктор Person() , поскольку он содержит исходное определение этих экземпляров.

Хитрый трюк заключается в том, что вы можете поместить круглые скобки в конец свойства constructor (содержащие любые требуемые параметры) для создания другого экземпляра объекта из этого конструктора. Конструктор - это функция в конце концов, поэтому её можно вызвать с помощью круглых скобок; вам просто нужно включить ключевое слово new , чтобы указать, что вы хотите использовать эту функцию в качестве конструктора.

Это хорошо работает. Вам не нужно будет использовать его часто, но это может быть действительно полезно, если вы хотите создать новый экземпляр и не имеете ссылки на исходный конструктор, который легко доступен по какой-либо причине.

Свойство constructor имеет другие применения. Например, если у вас есть экземпляр объекта и вы хотите вернуть имя конструктора этого экземпляра, вы можете использовать следующее:

Например, попробуйте это:

Примечание: Значение constructor.name может измениться (из-за прототипического наследования, привязки, препроцессоров, транспилеров и т. д.), Поэтому для более сложных примеров вы захотите использовать оператор instanceof .

Изменение прототипов

Давайте рассмотрим пример изменения свойства prototype функции-конструктора — методы, добавленные в прототип, затем доступны для всех экземпляров объектов, созданных из конструктора.

    Вернитесь к нашему примеру oojs-class-further-exercises.html и создайте локальную копию исходного кода. Ниже существующего JavaScript добавьте следующий код, который добавляет новый метод в свойство prototype конструктора:

Должно появиться всплывающее окно, с именем пользователя, определённым в конструкторе. Это действительно полезно, но ещё более полезно то, что вся цепочка наследования обновляется динамически, автоматически делая этот новый метод доступным для всех экземпляров объектов, полученных из конструктора.

Подумайте об этом на мгновение. В нашем коде мы определяем конструктор, затем мы создаём экземпляр объекта из конструктора, затем добавляем новый метод к прототипу конструктора:

Но метод farewell() по-прежнему доступен в экземпляре объекта person1 - его элементы были автоматически обновлены, чтобы включить недавно определённый метод farewell() .

Примечание: Если у вас возникли проблемы с получением этого примера для работы, посмотрите на наш пример oojs-class-prototype.html (см. также это running live).

Вы редко увидите свойства, определённые в свойстве prototype , потому что они не очень гибки при таком определении. Например, вы можете добавить свойство следующим образом:

Это не очень гибко, так как человека нельзя назвать так. Было бы намного лучше сделать это, создав fullName из name.first и name.last :

Однако это не работает, поскольку в этом случае this будет ссылаться на глобальную область, а не на область функции. Вызов этого свойства вернёт undefined undefined . Это отлично работало с методом, который мы определили ранее в прототипе, потому что он находится внутри области функций, которая будет успешно перенесена в область экземпляра объекта. Таким образом, вы можете определить постоянные свойства прототипа (т. е. те, которые никогда не нуждаются в изменении), но обычно лучше определять свойства внутри конструктора.

Фактически, довольно распространённый шаблон для большего количества определений объектов - это определение свойств внутри конструктора и методов в прототипе. Это упрощает чтение кода, поскольку конструктор содержит только определения свойств, а методы разделены на отдельные блоки. Например:

Этот образец можно увидеть в действии в примере приложения плана школы Петра Залевы.

Резюме

В этой статье рассмотрены прототипы объектов JavaScript (в том числе и то, как прототип цепочки объектов позволяет объектам наследовать функции друг от друга), свойство прототипа и как его можно использовать для добавления методов к конструкторам и другие связанные с этой статьёй темы.

В следующей статье мы рассмотрим то, как вы можете реализовать наследование функциональности между двумя собственными настраиваемыми объектами.

В этом уроке дается небольшое введение в тему прототипов. Полностью раскрыть её одним уроком невозможно. Не хватит даже целого курса. Прототипы познаются только через практику, перемешанную с теоретической подготовкой. Поэтому не переживайте, если не всё поймёте с первого раза, это нормально.

Прототипы — это механизм, который оказывает основное влияние на то, как работают объекты в JavaScript. Сами они напрямую в коде используются редко (и обычно только в библиотеках), но их знание важно для понимания поведения кода и отладки. Особенно при работе с классами, которые мы изучим дальше по курсу. В этом уроке мы затронем только самые основы. Глубоко разобраться с прототипами поможет наш курс, указанный в дополнительных материалах.

В JavaScript с каждым объектом связан прототип. Прототип – это обычный объект, хранящийся в специальном служебном поле [[prototype]] (к этому полю невозможно обратиться напрямую). Его можно извлечь так:

Зачем он нужен? Чтобы ответить на этот вопрос, нужно разобраться с тем, как в JavaScript работает вызов свойств. До этого момента все было просто: если в объекте есть свойство, то его можно вызывать и получить значение, если свойства нет, то при обращении к нему мы получим undefined . Это правда, но не вся. JavaScript устроен хитрее и ищет свойство не только в самом объекте. Если свойство для объекта не определено, то JavaScript смотрит в прототип и пытается выяснить есть ли это свойство у него. Если есть, то возвращается его значение.

В реальности процесс ещё сложнее. Если свойство не найдено в прототипе, то JavaScript смотрит прототип прототипа и так далее до конца цепочки, а у неё есть конец: последний прототип в цепочке прототипов всегда null. На базе этого механизма реализуется наследование. Эта тема выходит за рамки текущего урока.

Прототип есть даже у обычных JavaScript-объектов:

Именно по этой причине даже пустые объекты "содержат" (помним, что их содержит прототип) свойства и методы:

Доступ к прототипу можно получить не только из объектов, но и из свойства prototype конструктора, который эти объекты создаёт:

Теперь мы можем ответить на вопрос "откуда берется прототип?". Прототип – это объект, находящийся в свойстве prototype функции-конструктора, а не сам конструктор. Проверить работу прототипов достаточно легко, изменив их.

При этом никто не мешает заменить значение свойства getName в конкретном объекте. Это никаким образом не отразится на других объектах, так как они извлекают getName из прототипа:

Создание свойств через прототип – и есть правильный способ создания своих абстракций в JavaScript. Любая новая абстракция, которая нам нужна в коде, должна выглядеть как конструктор и прототип, наполненный нужными свойствами.

Что даёт этот механизм?

Самое простое – расширение ядра языка и библиотек без прямого доступа к исходному коду. Прототипы – невероятно гибкий механизм, который позволяет менять всё что угодно из любого места программы (в рантайме, то есть во время работы). Например, мы можем добавить или заменить любые методы в любых объектах самого языка.

Как и любой другой мощный механизм, прототипы невероятно опасны. Можно наменять такого, что программирование превратится в ад.

Читайте также: