Prototype и __proto__ что это вообще такое?
Наткнулся на такую картинку:
На картинке видно, что у нас есть какая-то функция(я так понимаю конструктор, тут бы я тоже хотел какого-то пояснения). У нее есть 2 свойства, которые ведут на Foo.prototype и на Function.prototype. Вопрос сформулировать тяжко, потому что я не понимаю, что это за 2 разных prototype. Можете разжевать?
Ответы (2 шт):
Функция является объектом, а у всех объектов, есть скрытое свойство, значением которого является объект-прототип, на основе которого он создан.
Для функций, таким прототипом является объект Function.prototype.
Также, у каждой функции есть свойство .prototype.
Если использовать функцию в качестве конструктора (вызвать с оператором new), значение этого свойства будет использовано в качестве прототипа, для создаваемого объекта.
Если попробовать суммировать кратко и грубо, в иерархии объектов .__proto__ указывает вверх, а .prototype вниз. .__proto__ указывает на источник-родитель, из которого объект берёт свойства, а .prototype указывает на источник, из которого объект будет раздавать свойства объектам-экземплярам, которые от него зависят.
.__proto__ существует в цепочке прототипного наследования у объектов, когда мы ещё не говорим о классах и экземплярах, это более базовый уровень. Это свойство создаётся автоматически, когда мы, например, используем Объект = Object.create(Объект_прототип). Также его можно использовать, чтобы изменить прототип у дочернего объекта, хоть это и не рекомендуется.
.prototype используется в классах и экземплярах. Он содержит объект, из которого экземпляры класса берут свойства и на который будет указывать их .__proto__. Раньше он создавался явно при создании конструктора, теперь он может создаваться автоматически при использовании синтаксиса классов. И если .__proto__ есть у каждого объекта, то .prototype есть только у объекта, который является функцией-конструктором для экземпляров.
Не знаю, стало ли понятнее, можно задавать уточняющие вопросы.
