Думайте об этом так. MyConstructor
является функциональным объектом, поэтому он был создан Function
; поэтому его [[Prototype]]
(или __proto__
) идентичен Function.prototype
.
Таким же образом, var myObj = new MyConstructor()
создает объект myObj
с [[Prototype]]
, идентичным MyConstructor.prototype
.
Другими словами, у функций есть свойство prototype
, и когда вы вызываете функции с new
, они создают объект, имеющий [[Prototype]]
, идентичный свойству prototype
функции конструктора ... однако свойство prototype
функции не совпадает со свойством [[Prototype]]
(или __proto__
), поскольку функция следует тем же правилам, что и другие объекты, и получает свое внутреннее свойство [[Prototype]]
от функции, которая ее построила (что всегда Function
, кстати).
Чтобы объяснить дальше, [[Prototype]]
и prototype
имеют совершенно разные цели. [[Prototype]]
используется при разрешении свойств объекта. Если у объекта нет свойства, проверяется его [[Prototype]]
, а затем [[Prototype]]
этого объекта и т. Д. До тех пор, пока не будет найдено свойство или пока вы не достигнете конца цепочки прототипов.
Напротив, prototype
- это механизм, с помощью которого вы присваиваете [[Prototype]]
свойства объектам, поскольку вы не можете получить к ним прямой доступ, кроме как с нестандартным свойством __proto__
.
Поскольку функции являются объектами, они имеют как внутреннее свойство [[Prototype]]
, используемое для разрешения свойств, как с обычными объектами, так и свойство prototype
, которое назначается как [[Prototype]]
новых объектов, созданных функцией.