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.