2016-09-27 3 views
0

Я хочу клонировать функцию, но мне нужно удалить оригинал.Клонировать функцию, а затем удалить ее

let obj={}; 
obj.funct=function funct() { console.log('test');} 
let clone={}; 
clone.funct=obj.funct.bind({}); 
delete obj.funct 

Но функция удаляется в обоих объектах.

Любая идея? Может быть, проблема ref или val?

Заранее за вашу помощь.

+0

Невозможно воспроизвести -> https://jsfiddle.net/adeneo/pfpdxs4x/ – adeneo

+0

Я не вижу проблемы здесь 'obj.funct()' будет иметь ошибку (* поскольку он был удален *) и 'clone.funct()' работает эффективно. –

ответ

0

Я использовал внутри цикла и клонирование один и тот же ссылочный объект, поэтому удаление одного и того же var.

Извините за мою ошибку и благодарю вас за то, что вы показали мне, что код работает правильно.

ie: вы можете добавить все -1, что хотите. Извините, еще раз

-1

Когда вы передаете значение clone.funct, вы действительно просто передаете ссылку на исходную функцию. Убейте исходную функцию, и ссылка идет ни к чему.

Один из способов разорвать паритет будет stringify исходной функции, а затем использовать функцию конструктора для создания клона:

const obj={}; 
 
obj.funct=function funct(a,b) { console.log(a,b);} 
 
const clone={}; 
 
const functString = obj.funct.toString(); 
 
clone.funct= new Function('return (' + functString + ')(...arguments)'); 
 
delete obj.funct 
 

 
console.log('Original:',obj.funct) 
 
console.log('Cloned:',clone.funct) 
 
clone.funct('hello', 'there')

+1

Uhm, thats what 'bind' делает, он возвращает новую функцию. – adeneo

+0

Хорошая точка, @adeneo. Забыл обертку. Проверить снова. :) – jmealy

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