Показать сообщение отдельно
  #6 (permalink)  
Старый 29.07.2019, 18:47
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Launder
Ну, то есть, даже вот такую простейшую функцию со своими свойствами(да, по-видимому и без них) - не склонировать?
такую - можно) Но в общем случае функция может хранить внешние переменные в замыкании, либо быть стрелочной функцией и держать кого-то за this. И вот это мы не склонируем.

Можно сделать обертку, которая будет вызывать исходную функцию:
function cloneFunc(f) {
  if (!f) { return null; }
  var args = Array.from({length: f.length}).map((v, i) => 'a' + i).join(',');
  var newFunc = new Function('f', 'return function (' + args + ') { return f.call(this, ' + args + '); }')(f);
  return Object.assign(newFunc, f);
}

здесь костыль с "new Function" позволяет сохранить length исходной функции, так то можно и проще сделать.

----
если у нас глубокое копирование, то вместо Object.assign надо свою функцию использовать, я так уж для примера написал

Последний раз редактировалось Alexandroppolus, 29.07.2019 в 18:52.
Ответить с цитированием