Найти в Дзене
WeeDн Р

prototype и __proto__ / JavaScript

Оглавление

Быстрые вспоминалки

  • У любого объекта есть __proto__
  • __proto__ - почти всегда объект
  • любой объект создается с помощью конструктора / класса
  • Чтобы понимать, что за __proto__ нужно ТОЧНО знать с помощью какой функции-конструктора была создан данный объект (new XXX(..))
  • prototype есть у любого function или class
  • __proto__ - ссылка на prototype родителя (конструктора)

prototype и __proto__ - обьект в JS

Вспоминаем обьекты

Здесь в памяти всего один обьект у которого value: 17, и на него ссылается обьект a, ссылка b.test, и c.
Это означает что обьект - ссылочный тип данных, и они общаются через ссылки

-2
-3

Теперь давай про proto и prototype

-4

__proto__ - есть у всех объектов

const users = {} // есть __proto__

const ages = [] // тоже есть __proto__ , т.к. массив это объект

let age = 17 // Да age это примитив, но если мы к примитиву обращаемся, как к объекту, то в памяти временно создается объектная версия этого примитива и он становиться объектом , и соответственно у него есть __proto__

(Bool, string) // также как и для age

function test() {...} // функция это объект, соответственно у него есть proto
class Aboba() {...} // класс - навороченная функция, следовательно есть proto

Чтобы понимать почему не у всех обьектов равны __proto__ нужно понимать, как они создаются

Constructor

Любой обьект в JS создается с помощью конструктора!
(за кадром движок прописывает создание)

Например

-5

Во втором не равны, потому что созданы с помощью другого класса

PROTOTYPE

-6
-7

Зачем все это нужно?

Можно создавать для prototype методы

-8