функции наследуют от Function
Вы цитируете MDN свободно. То, что он на самом деле говорит это:
функциональные объекты наследуют от Function.prototype
Обратите внимание, что на странице MDN, начальное слово «функция» в приведенном выше предложении капитализируются, но только потому, что на начало предложения, а не потому, что оно относится к объекту JS Function
. Это относится к обычным старым функциям, объявленным как function() { }
.
Помните, что MDN написано простым смертным. Я бы предпочел, чтобы они не использовали слова «наследовать» и «наследование», не говоря уже о «полученных». У JS нет понятия наследования в строгом смысле этого слова. Если вы используете эту терминологию, вы в конечном итоге запутаетесь. У JS есть прототипы, связанные с объектами. При доступе к объекту объекта, если он не найден, проконсультируется с прототипом. Если их не найти, поскольку прототип также является объектом с прототипом, проконсультируйтесь с прототипом, и так далее по цепочке.
Следовательно, вышеприведенное предложение было бы лучше написано как «функциональные объекты имеют в качестве своего прототипаFunction.prototype
».
Объект JS Function
не связан непосредственно с Function.prototype
, кроме того факта, что Function.prototype
является собственностью Function
, и, так как Function
объект сам по себе является функцией, она сама по себе имеет Function.prototype
как его прототип. Независимо от того, какие свойства могут или не могут присутствовать на Function
, или висели на нем вами, не имеют ничего общего с цепочкой прототипов и не «унаследованы» кем-либо.
Когда вы делаете (function() { }).call()
, свойство/метод call
сначала просматривается на самом объекте функции; если он там не существует, как обычно это не будет, тогда он проверяется на прототипе, который присваивается по существу, когда объявлена функция, которая равна Function.prototype
. Где еще вы бы поставили такие методы, как call
или apply
, если не на Function.prototype
? Что еще вы могли бы назвать прототипом, автоматически назначенным для функций, отличных от Function.prototype
?
В качестве примечания обратите внимание, что Function.call
правильно разрешит внутреннюю функцию call
. Зачем? Не потому, что там находится call
, либо потому, что это происходит из-за того, что регулярные функции «наследуют» call
, а скорее потому, что, как я упоминал ранее, Function
сам по себе является функцией, и поэтому имеет прототип Function.prototype
, call
можно найти на его прототип цепи.
В чем смысл Function.prototype
? Почему бы не переместить свои свойства на Function
и не удалось определить Function.prototype
? Функции будут получены из Function
.
X.prototype
является свойством X, используемым в качестве прототипа для объектов, созданных с использованием X в качестве конструктора. Поэтому для назначения правильного прототипа объектам, созданным с использованием Function
в качестве конструктора (который включает функции, объявленные как function x() { }
), прототип должен быть представлен как свойство prototype
на Function
.
Я бы предположил, что это связано с тем, что свойства прототипа разделяются между всеми экземплярами, в отличие от свойств экземпляра, которые являются локальными для каждого экземпляра. –
> «Функции будут получены из функции вместо». Поверьте, это ваш источник путаницы. Не знаете, где именно вы это читали, но функции не могут быть получены из функций в прототипном смысле. –
@ nikc.org Хорошо, но почему из 'Function.prototype'? Или это не действительно наследуемые свойства, если мы выполняем 'f.prototype = Function', где' f' является функцией? Я имею в виду, если вы хотите наследовать от функции, вы делаете 'f.prototype = super_f', а не' f.prototype = super_f.prototype', правильно? – Downvoter