Подтвердить что ты не робот

Почему у меня есть Function.call в javascript?

> Function.call == Function.prototype.call
true
> Function.prototype == Function
false

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

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

4b9b3361

Ответ 1

Потому что Function сам является прототипом Function

console.log(Function instanceof Function);
console.log(Object.getPrototypeOf(Function) === Function.prototype);

Итак, все функции прототипа Function также доступны в Function.

Цитата спецификация,

Объект-прототип функции сам по себе является объектом 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 do

Поскольку прототип функции Array - это объект Function, а не объект Array.

console.log(Object.getPrototypeOf(Array) === Function.prototype);

Вот почему мы получаем call, apply, bind и т.д. в функции Array. Объект Array был прототипом Array, тогда slice был бы доступен и для объекта Array.