Πώς μπορώ να κλωνοποιήσω σωστά ένα αντικείμενο JavaScript;

Έχω ένα αντικείμενο, x. Θα ήθελα να το αντιγράψω ως αντικείμενο y, έτσι ώστε οι αλλαγές στο y να μην τροποποιούν το x. Συνειδητοποίησα ότι η αντιγραφή αντικειμένων που προέρχονται από ενσωματωμένα αντικείμενα της JavaScript θα οδηγήσει σε επιπλέον, ανεπιθύμητες ιδιότητες. Αυτό δεν αποτελεί πρόβλημα, αφού αντιγράφω ένα από τα δικά μου, κυριολεκτικά κατασκευασμένα αντικείμενα.

Πώς μπορώ να κλωνοποιήσω σωστά ένα αντικείμενο JavaScript;

Από αυτό το άρθρο: Πώς να αντιγράφετε πίνακες και αντικείμενα στη Javascript του Brian Huisman:

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (var i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
};
Σχόλια (6)

Εδώ είναι μια συνάρτηση που μπορείτε να χρησιμοποιήσετε.

function clone(obj) {
    if(obj == null || typeof(obj) != 'object')
        return obj;    
    var temp = new obj.constructor(); 
    for(var key in obj)
        temp[key] = clone(obj[key]);    
    return temp;
}
Σχόλια (4)

Αν δεν υπάρχουν κυκλικές εξαρτήσεις στο αντικείμενό σας, προτείνω να χρησιμοποιήσετε μια από τις άλλες απαντήσεις ή τις μεθόδους αντιγραφής της jQuery's, καθώς όλες φαίνονται αρκετά αποτελεσματικές.

Εάν υπάρχουν κυκλικές εξαρτήσεις (δηλαδή, δύο υπο-αντικείμενα συνδέονται μεταξύ τους), είστε κατά κάποιο τρόπο χαμένοι, καθώς δεν υπάρχει (από θεωρητική άποψη) κανένας τρόπος να επιλυθεί αυτό το ζήτημα κομψά.

Σχόλια (1)