В JavaScript функция может использоваться как конструктор. Это означает, что мы можем создавать объекты из них, используя новое ключевое слово. Каждая функция конструктора поставляется со встроенным объектом, связанным с ними. Этот встроенный объект называется прототипом. Экземпляры функции-конструктора используют __proto__
для доступа к прототипу его конструкторской функции.
function Foo(){}
Foo
имеет свойство прототипа, которое указывает на его прототип, который является Foo.prototype
(см. изображение). function Foo
строится конструктором [[Function]]. Таким образом, __proto__
нашего Foo function
укажет на прототип своего конструктора, который является Function.prototype
. Function.prototype
сам по себе является не чем иным, как объектом, который построен из другого системного конструктора, называемого [[Object]]
. Таким образом, [[Object]]
является конструктором Function.prototype
. Итак, мы можем сказать, что Function.prototype
является экземпляром [[Object]]
. Таким образом, __proto__
из Function.prototype
указывает на Object.prototype
. Object.prototype
- последний человек, стоящий в цепи прототипов. Я имею в виду, что он не был построен. Это уже есть в системе. Поэтому его __proto__
указывает на null
. Foo
. Когда мы создаем экземпляр с помощью new Foo()
, он создает новый объект, который является экземпляром Foo
. Это означает, что Foo
является конструктором этих экземпляров. Здесь мы создали два экземпляра (x и y). __proto__
x и y указывает на Foo.prototype
.