Sobes.tech
Middle

Van egy objektum, amelynek néhány értéke függvény. Hogyan készíthetünk róla mély másolatot? Vannak nehézségek?

sobes.tech MI

Válasz az MI-től

A JavaScript-ben lévő objektumok mély másolása funkciókkal nem triviális feladat, mivel a szabványos módszerek (például JSON.parse(JSON.stringify(obj))) nem másolják a funkciókat.

A funkciók megőrzésével történő mély másolathoz rekurzívan végig lehet menni az objektumon, és másolni minden tulajdonságot:

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj; // Primitívek és funkciók ugyanúgy visszaadva
  }

  if (typeof obj === 'function') {
    return obj.bind({}); // Egyszerűen vissza lehet adni a funkciót vagy kötést létrehozni
  }

  if (Array.isArray(obj)) {
    return obj.map(deepClone);
  }

  const clonedObj = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      clonedObj[key] = deepClone(obj[key]);
    }
  }
  return clonedObj;
}

Nehézségek:

  • A funkciók referencia szerint másolódnak, mivel belső állapotuk (lezárások) nem másolhatók.
  • Ha a funkciók külső kontextustól függenek, a másolat másképp működhet.
  • Ciklikus hivatkozások további kezelést igényelnek (pl. WeakMap segítségével).

Így a funkciókkal történő mély másolás lehetséges, de a funkciók referencia szerint másolódnak, ezt figyelembe kell venni.