Sobes.tech
Middle

Կան առարկա, որի որոշ արժեքներ ֆունկցիաներ են։ Ինչպե՞ս անել նրա խորը պատճենը։ Կան դժվարություններ։

sobes.tech AI

Պատասխան AI-ից

JavaScript-ում օբյեկտների խորքային պատճենումը ֆունկցիաներով ոչ թե հեշտ է, քանի որ ստանդարտ մեթոդները (օրինակ, JSON.parse(JSON.stringify(obj))) ֆունկցիաներ չեն պատճենում:

Ֆունկցիաներով խոր պատճենում ստեղծելու համար, կարող եք օգտագործել օբյեկտի ռեկուրսիվ անցում և պատճենել յուրաքանչյուր հատկությունը:

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj; // Պրիմիտիվներ և ֆունկցիաներ վերադառնում են ինչպես են
  }

  if (typeof obj === 'function') {
    return obj.bind({}); // Կարող եք պարզապես վերադարձնել ֆունկցիան կամ ստեղծել բայնդինգ
  }

  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;
}

Իշխանություններ:

  • Ֆունկցիաները պատճենվում են հղումով, քանի որ դրանց ներքին վիճակը (կապեր) չի կարող պատճենվել:
  • Եթե ֆունկցիաները կախված են արտաքին կոնտեքստից, պատճենը կարող է աշխատել այլ կերպ:
  • Ցիկլային հղումները պահանջում են լրացուցիչ մշակում (օրինակ, WeakMap-ի միջոցով):

Այսպիսով, ֆունկցիաներով խոր պատճենումը հնարավոր է, բայց ֆունկցիաները պատճենվում են որպես հղումներ, և դա պետք է հաշվի առնել: