Насколько я понимаю, функция копируется как примитив - по значению. А объект - по ссылке. Допустим у нас есть определённая функция и мы сохраняем её в переменную - мы получим ещё одну копию. Но если у этой функции есть свойства или методы, как быть тогда?
Как совместить эти способы?...
Ниже способ копирования среднестатистического объекта с возможными перекрёстными ссылками. Идея в том, что мы делаем полные копии всех объектов, на которые ссылается данный объект, но только один раз. И там где ссылка ссылается на оригинал, в копии мы ссылаемся на копию этого оригинала.
Удобнее всего это сделать с помощью Map:
function deepCopy(obj)
{
var newObj = new Object();
var map = new Map();
map.set(obj, newObj);
function engine(obj1, newObj1)
{
for(var key in obj1)
{
if( typeof( obj1[key] ) !== 'object' || obj1[key] == null)
{
newObj1[key] = obj1[key];
}
else if( !map.get( obj1[key] ) )
{
newObj1[key] = new Object();
map.set(obj1, newObj1);
engine( obj1[key], newObj1[key] );
}
else
{
newObj1[key] = map.get(obj1[key]);
}
}
}
engine(obj, newObj);
return newObj;
}
Можно это делать и без Map, делаешь массив из ссылок на объекты, а когда сталкивается с новым объектом при копировании, то, сначала просматриват свою коллекцию ссылок и если находит, то, там массив из двух элементов, первый элемент - старая ссылка, второй - новая. нашли старую - выдали новую. если кому интересно скину код, но он слегка объёмный, с Map таже логика но всё более прозрачно.
Но каким образом, при этом, копировать значения самой функции - что-то мне совсем не понятно