Показать сообщение отдельно
  #1 (permalink)  
Старый 28.07.2019, 20:28
Интересующийся
Отправить личное сообщение для Launder Посмотреть профиль Найти все сообщения от Launder
 
Регистрация: 25.04.2019
Сообщений: 19

Глубокое копирование в JavaScript. Функция + объект.
Насколько я понимаю, функция копируется как примитив - по значению. А объект - по ссылке. Допустим у нас есть определённая функция и мы сохраняем её в переменную - мы получим ещё одну копию. Но если у этой функции есть свойства или методы, как быть тогда?
Как совместить эти способы?...
Ниже способ копирования среднестатистического объекта с возможными перекрёстными ссылками. Идея в том, что мы делаем полные копии всех объектов, на которые ссылается данный объект, но только один раз. И там где ссылка ссылается на оригинал, в копии мы ссылаемся на копию этого оригинала.
Удобнее всего это сделать с помощью 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 таже логика но всё более прозрачно.
Но каким образом, при этом, копировать значения самой функции - что-то мне совсем не понятно
Ответить с цитированием