Sobes.tech
Middle

Υπάρχει ένα αντικείμενο, μερικές από τις τιμές του είναι λειτουργίες. Πώς να κάνετε ένα βαθύ αντίγραφο; Υπάρχουν δυσκολίες;

sobes.tech AI

Απάντηση από AI

Ο βαθύς αντίγραφος ενός αντικειμένου με λειτουργίες σε JavaScript δεν είναι απλή υπόθεση, καθώς οι τυπικές μέθοδοι (π.χ., JSON.parse(JSON.stringify(obj))) δεν αντιγράφουν λειτουργίες.

Για να δημιουργήσετε ένα βαθύ αντίγραφο διατηρώντας τις λειτουργίες, μπορείτε να χρησιμοποιήσετε μια αναδρομική διαδρομή του αντικειμένου και να αντιγράψετε κάθε ιδιότητα:

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj; // Τα primitives και οι λειτουργίες επιστρέφονται όπως είναι
  }

  if (typeof obj === 'function') {
    return obj.bind({}); // Μπορείτε απλά να επιστρέψετε τη λειτουργία ή να δημιουργήσετε ένα binding
  }

  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).

Έτσι, ο βαθύς αντίγραφος με λειτουργίες είναι εφικτός, αλλά οι λειτουργίες αντιγράφονται ως αναφορές, και αυτό πρέπει να ληφθεί υπόψη.