Comments 22
В конце концов proto это всего лишь синтаксический сахар вокруг свойств constructor и prototype. При этом не слишком широко применяемый и вошедший в спецификацию сравнительно недавно в 2015 году. Мне кажется что для понимания что там за кадром в классах es7 было бы полезнее знать именно основу прототипного наследования которая была в es с самых первых версий
То что можно на лету менять прототип и его содержимое, тем самым меняя поведение конечной сущности, — это заслуга отнюдь не прототипного наследования (хотя косвенно и оно участвует), а динамической основы языка. Такое же поведение можно реализовать и без прототипов, если задаться целью.
Грубо говоря, наличие прототипов и динамичности позволяет как «вить веревки», так и «стрелять себе в ногу». Все зависит от желания пользоваться парадигмами или возможностями.
А все эти способности на лету чего-то портить никак не связаны ни с ООП ни с прототипами. Все это динамичность языка.
А вы пытаетесь показать разницу между классами и прототипами в том что прототипы можно менять или клеить на лету.
В этом и есть ошибка подхода.
А еще, наличие обьектов не делает ваш код обьектно-ориентированным.
new Person()
напишите, а то tom-то так и не создался
Как по мне, для джунов написано слишком академическим языком, из-за чего сложнее понять. Например эта статья воспринимается легче. Удивительно, но за 10 лет она практически не потеряла актуальность.
Не страшно, сама статья неплохая. Я сам пишу так-же, потом перечитываю и упрощаю. Разбиваю длинные предложения на простые, убираю лишние обороты, смотрю чтобы термины не плавали. Можно сказать, рефакторю текст. Примеры того что бросается в глаза:
- “сущности”, “инстанции”
“экземпляры” привычнее, иногда допустимо разговорное “инстанс” - “создавая отношение генерализации — специализации”
смотрится уместнее в статьях про нюансы ООП, UML. Здесь лучше “наследуя его” - “генерального класса(суперкласса)”
≈ “родителя” - “Класс представляет собой некий формализованный обобщённый набор характеристик сущностей, которые он может породить.”
тяжеловато, описание полегче
Это все конечно субъективно, может другие хабраюзеры не согласятся со мной.
Наследование это хороший оборот, но я сознательно употребил генерализации — специализации чтобы отразить суть происходящего. Ведь и в прототипной организации наследование. Но только в классовой организации присутствуют понятия подкласс и суперкласс.
//сущность tomSon давно уже создана, но мы добавляем свойства в её прототип и можем реализовать в ней поведение, которое будет оперировать этими свойствами
учитывая тот факт, что метод добавлен непосредственно в объект (в представленном коде), а не в его прототип, в этом поможет убедиться состав объекта на которое ссылается свойство __proto__
Соответсвенно и последующие рассуждения искажаются допущенным недопониманием рассматриваемого вопроса
Вопрос про свойства обьекта: чей ты? Объект может содержать собственные свойства или делегировать другому объекту (предку), и так по цепочке.
Классические ООП языки реализуют обе схемы, прототипные только вторую. Поэтому типы всех объектов в js одинаковы — это object. Слово class из ES6 лишь синтаксический сахар, который ни чего не меняет в плане типизации.
Более наглядно, с картинками, это описано в статье про python. Если там исключить классы, оставив лишь одни метаклассы, то получится почти как в JavaScript
blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses
С точки зрения теории ООП особой разницы нет, т.к. она даёт лишь поверхностные определения. На практике это приводит к тому, что в js возможности, связанные с системой типов и их проверками довольно ограничены, по сравнению с классическими ООП языками.
Взгляд со стороны EcmaScript на общую теорию ООП