Быстрые вспоминалки
- У любого объекта есть __proto__
- __proto__ - почти всегда объект
- любой объект создается с помощью конструктора / класса
- Чтобы понимать, что за __proto__ нужно ТОЧНО знать с помощью какой функции-конструктора была создан данный объект (new XXX(..))
- prototype есть у любого function или class
- __proto__ - ссылка на prototype родителя (конструктора)
prototype и __proto__ - обьект в JS
Вспоминаем обьекты
Здесь в памяти всего один обьект у которого value: 17, и на него ссылается обьект a, ссылка b.test, и c.
Это означает что обьект - ссылочный тип данных, и они общаются через ссылки
Теперь давай про proto и prototype
__proto__ - есть у всех объектов
const users = {} // есть __proto__
const ages = [] // тоже есть __proto__ , т.к. массив это объект
let age = 17 // Да age это примитив, но если мы к примитиву обращаемся, как к объекту, то в памяти временно создается объектная версия этого примитива и он становиться объектом , и соответственно у него есть __proto__
(Bool, string) // также как и для age
function test() {...} // функция это объект, соответственно у него есть proto
class Aboba() {...} // класс - навороченная функция, следовательно есть proto
Чтобы понимать почему не у всех обьектов равны __proto__ нужно понимать, как они создаются
Constructor
Любой обьект в JS создается с помощью конструктора!
(за кадром движок прописывает создание)
Например
Во втором не равны, потому что созданы с помощью другого класса
PROTOTYPE
Зачем все это нужно?
Можно создавать для prototype методы