Можно всё скопировать кроме внутренних полей!
var sum = function(a, b) {
return a + b;
}
sum.a = 'Masha';
sum.b = 'Phedya';
function cloneFunction(fn) {
return Object.assign({ __proto__: fn.constructor.prototype }, fn);
}
var sum2 = cloneFunction(sum);
console.log(sum2);
Но такую функцию вы не можете вызвать как функцию, поскольку у неё нет внутреннего поля [[Call]]. В JS нет публичного механизма для чтения и копирования внутренних полей (так называемые
слоты), поэтому невозможно произвести ручное копирование некоторых объектов, которые были созданы при помощи встроенных конструкторов (например, функции, промисы и т. д.), если только класс не предоставляет метод для копирования объекта (как например метод cloneNode у класса Node!)
А зачем вам именно копия функции?