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

Вы должны поместить все столбцы SELECT в GROUP BY или использовать на них функции, которые сжимают результаты до одного значения (например, MIN, MAX или SUM).

Простой пример, чтобы понять, почему это происходит: представьте, что у вас есть такая база данных:

FOO BAR
0   A
0   B

и вы запускаете SELECT * FROM table GROUP BY foo. Это означает, что база данных должна возвращать одну строку в качестве результата с первым столбцом 0, чтобы выполнить GROUP BY, но теперь есть два значения bar. Какой результат вы ожидаете - A или B? Или должна ли база данных возвращать более одной строки, нарушая контракт GROUP BY?

2
задан Moshe Slavin 5 March 2019 в 11:24
поделиться

2 ответа

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)

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

0
ответ дан DomQ 5 March 2019 в 11:24
поделиться

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/ [1143 ]

Теперь ответим на ваш вопрос:

Что означает 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!

0
ответ дан Jayendra Sharan 5 March 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: