Что означает Function.prototype .__ proto__? - PullRequest
2 голосов
/ 05 марта 2019

Я новичок в Javascript и узнаю о Object Oriented и prototyping в нем.

Насколько я знаю, Object является функцией и создается функцией, потому что Object.__proto__ === Function.prototype, но просматривая различные диаграммы онлайн, я весьма смущен тем, как Function.prototype.__proto__ === Object.prototype.

Что означает Function.prototype.__proto__?

Разве это не то, что разработано владельцами языков, так как функция - это первое, из чего все приходит.

Тогда что это значит?Мне не хватает какого-то важного факта?Я просмотрел другие StackOverflow ответы, но не могу найти ничего связанного с ним.

Ответы [ 2 ]

1 голос
/ 05 марта 2019

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!

1 голос
/ 05 марта 2019

myFunc.prototype - это __proto__ любого объекта, созданного путем вызова new myFunc().

Думая в терминах классического ОО (в стиле Java или C ++), вы можете сказать, что myFunc является конструктором и (следовательно) myFunc.prototype является классом. В этом смысле myFunc.prototype.__proto__ является суперклассом; то есть прототип прототипа всех объектов, созданных с помощью new myFunc.

Одна полезная вещь, которую вы можете сделать для myFunc.prototype.__proto__, это присвоить ей создание отношения суперкласса, например

myFunc.prototype.__proto__ = mySuperclassConstructor.prototype

Эта идиома проливает свет на то, почему выполняется Function.prototype.__proto__ === Object.prototype (суть вашего вопроса): это просто означает, что Function является подклассом Object - Иными словами, среды выполнения JavaScript делают что-то эквивалентное приведенному выше коду фрагмент их прелюдии, чтобы сделать Function подклассом Object (как они должны, согласно ECMA-262 §§ 19.2.2 и 19.2.3)

Осторожно, хотя __proto__ работает во всех современных (2019) реализациях JavaScript (node.js и браузеры), его использование нестандартно и медленно, Попробуйте вместо этого использовать «настоящие» классы ES6.

...