Поскольку Function
сам является прототипом Function
console.log(Function instanceof Function);
console.log(Object.getPrototypeOf(Function) === Function.prototype);
Итак, все функции в Function
сек прототипа доступны в Function
также.
Цитирование the specification,
Объект Прототип функции сам объект Function (его [[Class]] является "Function")
Другой способ, чтобы подтвердить это было бы ,
console.log(Function.call === Function.prototype.call);
это означает, что Function.call
объект и Function.prototype.call
объект одинаковый.
console.log(Function.hasOwnProperty('call'));
это означает, что сам Function
объект не имеет call
свойство.
console.log(Function.prototype.hasOwnProperty('call'));
это означает, что Function.prototype
объект имеет свойство call
.
Array.slice
не существует, но Array.prototype.slice
сделать
Поскольку прототип Array
функции является Function
объектом, а не Array
объекта.
console.log(Object.getPrototypeOf(Array) === Function.prototype);
Именно поэтому мы получаем call
, apply
, bind
и т.д. на функцию Array
. Объект был прототипом Array
, тогда slice
был бы доступен и на объекте Array
.
yep. Функция - это конструктор. 'Array.call === Function.call'. – Louy
это похоже на класс класса Java? – valepu
@valepu Вид, да. Если бы JavaScript был языком на основе класса, мы бы сказали, что 'Function' является экземпляром' Function', но в Java 'Class' является * not * экземпляром' Class' (поскольку классы не являются экземплярами 'Class', или чего-либо вообще). У класса Class все еще есть странная рекурсия, хотя, поскольку у него есть связанный объект класса, типа 'Class' и' Class.class == Class.class.getClass() '. – immibis