Стив Йегге недавно опубликовал интересный пост в блоге о том, что он называет универсальным шаблоном проектирования. Там он подробно описывает использование прототипов в качестве инструмента моделирования вместо классов. Мне нравится, как это приводит к меньшему сцеплению по сравнению с наследованием. Но это то, что можно получить и с классами, реализуя классы в терминах других классов вместо наследования. Есть ли у кого-нибудь еще истории успеха в использовании прототипов, и, возможно, он может помочь объяснить, где использование прототипов выгодно по сравнению с классами. Я предполагаю, что все сводится к статическому моделированию по сравнению с динамическим моделированием, но хотелось бы получить больше примеров.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Прототипы - это форма наследования, просто объекты наследуют атрибуты и поведение непосредственно от других объектов, вместо того, чтобы получать свои атрибуты и поведение от своего класса, который наследуется от других классов.
В качестве примеров просмотрите любой объектно-ориентированный код в язык на основе прототипов, например, JavaScript.
у вас все наоборот: наследование на основе классов ООП - это подмножество прототипирования (которое является подмножеством утиной печати)
Я думаю, вы меня неправильно истолковали. Я говорил, что прототипы - это одна форма наследования, а классы / подклассы - другая форма. Я не пытался вдаваться в общий вопрос, «что одно может быть реализовано с точки зрения другого».
Один интересный момент заключается в том, что легко сделать объектно-ориентированный язык действующим на основе прототипа, но сложно сделать объектно-ориентированный язык действующим на основе прототипа.
Не совсем понятно, как будет выглядеть объектно-ориентированный прототип в качестве прототипа, кроме композиции и наследования, о которой вы упомянули.
Язык прототипов упрощает сложное поведение наследования. Вы можете реализовать поведение, подобное множественное наследование, миксин, или просто выбрать то, что вы хотите от одного объекта, чтобы добавить к другому.
Статья в Википедии упоминает: «Сторонники программирования на основе прототипов часто утверждают, что языки на основе классов поощряют модель разработки, которая фокусируется в первую очередь на таксономии и отношениях между классами. Напротив, программирование на основе прототипов рассматривается как побуждающее программиста сосредоточиться на поведение некоторого набора примеров и только позже беспокоиться о том, чтобы классифицировать эти объекты в архетипические объекты, которые позже будут использоваться аналогично классам ".
Это не значит, что в парадигме прототипа есть все «за» и «против». Если объектно-ориентированный подход является более строгим, то это потому, что он сам так хочет. Я понимаю, где такая гибкость может вызвать у вас проблемы, если вы не будете осторожны.
Для тех, кто интересуется, NewtonScript был (есть) двуязычным языком: у вас были прототипы и у вас были классы. Вы можете выбрать, наследовать ли от класса, от прототипа или от того и другого.
семантически прототипы + делегирование == классы + наследование