А откуда у нашей fun взялся метод apply?
Все оттуда же. Функция - объект
Любая функция создается с помощью (неявного) вызова new Function()
Мы написали
function fun() {...}
На самом деле получили
var fun = new Function(....)
Function - встроенная функция JS. Как и любая функция она содержит свойство prototype
Function.prototype = {
constructor: Function,
// и прочие методы
apply: function () {...},
call: function () {...},
bind: function () {...},
.....
}
Когда вызвался fun = new Function (...)
как и для всех объектов произошло
fun.__proto__ = Function.prototype;
Поэтому методы apply, call, bind... стали доступны для fun