TL; DR
__proto__
- это свойство object
, которое позволяет вам искать в цепочке прототипов. prototype
- это свойство Function
, которое позволяет добавлять общие функции в функцию конструктора.
Длинный ответ
Поймите это из примера, допустим, вы создали функцию конструктора.
function A() {}
и затем создайте его экземпляр, var a = new A()
.
Затем добавьте функцию следующим образом:
A.prototype.getA = function () { return 'A'; }
.
Теперь, если вы попытаетесь получить доступ к a.getA()
, вы получите результат, то есть getA
будет выполнено.
Но как он узнает о функции getA
, хотя getA
был добавлен после создания экземпляра a
. Из-за использования __proto__
вы можете перемещаться по цепочке (вы, наверное, слышали о цепочке прототипов).
Технически, __proto__
является свойством объекта, тогда как prototype
является свойством function
. Но как functions
может иметь собственность? Потому что все в JavaScript неявно преобразуется в объект. Когда-нибудь задумывались, как вы могли что-то вроде этого: 'test'.toUpperCase()
? Разве строковые литералы не являются «объектами» и они являются примитивами?
Прочитайте это для справки: http://jayendra.co.in/objects-in-javascript/
Теперь, чтобы ответить на ваш вопрос:
Что означает Function.prototype.__proto__
?
Вы пытаетесь получить доступ к свойству prototype
функции конструктора Function
. Помните, что prototype
сам по себе является object
, поэтому вы можете получить доступ к таким свойствам, как constructor
и __proto__
.
Function.prototype.__proto__ === Object.prototype
Чтобы включить сцепление, при доступе к свойству __proto__
вы ищите!
Любая функция может получить доступ ко всем свойствам объекта. Как?
Свойство Object
, скажем toString
. Вы можете сделать, A.toString() // A created at the start
. Но мы никогда не создавали функцию toString
для функции конструктора A
!