2016-01-15 3 views
11
> Function.call == Function.prototype.call 
true 
> Function.prototype == Function 
false 

Почему существуют Function.prototype.* методы существуют как Function.*? Это кажется непоследовательным.Почему у нас есть Function.call в javascript?

Это не относится к любому другому первичному типу (Array.slice не существует, но Array.prototype.slice).

ответ

18

Поскольку 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.

+0

yep. Функция - это конструктор. 'Array.call === Function.call'. – Louy

+0

это похоже на класс класса Java? – valepu

+1

@valepu Вид, да. Если бы JavaScript был языком на основе класса, мы бы сказали, что 'Function' является экземпляром' Function', но в Java 'Class' является * not * экземпляром' Class' (поскольку классы не являются экземплярами 'Class', или чего-либо вообще). У класса Class все еще есть странная рекурсия, хотя, поскольку у него есть связанный объект класса, типа 'Class' и' Class.class == Class.class.getClass() '. – immibis

Смежные вопросы