Вы должны поместить все столбцы 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
?
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.
TL; DR
blockquote>
__proto__
является свойствомobject
, которое позволяет вам искать в цепочке прототипов. В то время какprototype
является свойствомFunction
, которое позволяет вам добавлять общие функции в функцию конструктора.Длинный ответ
blockquote>Поймите это на примере, скажем, вы создаете функцию конструктора.
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 ]
Теперь ответим на ваш вопрос:
Что означает
blockquote>Function.prototype.__proto__
?Вы пытаетесь получить доступ к свойству
prototype
вFunction
функция конструктора. Помните, чтоprototype
сам по себе являетсяobject
, поэтому вы можете получить доступ к таким свойствам, какconstructor
и__proto__
.blockquote>
Function.prototype.__proto__ === Object.prototype
Чтобы включить сцепление, при доступе к свойству
__proto__
вы ищите!Любая функция может получить доступ ко всем свойства объекта. Как?
blockquote>Свойство
Object
, скажем,toString
. Вы можете сделать,A.toString() // A created at the start
. Но мы никогда не создавали функциюtoString
для функции конструктораA
!