Exactement cloner un objet en javascript
J'ai essayé exactement cloner un objet en javascript. Je sais que la solution suivante à l'aide de jquery:
var newObject = jQuery.extend({}, oldObject);
//Or
var newObject = jQuery.extend(true, {}, oldObject);
mais le problème c'est que les objets de type se perd:
var MyClass = function(param1, param2) {
alert(param1.a + param2.a);
};
var myObj = new MyClass({a: 1},{a: 2});
var myObjClone = jQuery.extend(true, {}, myObj);
alert(myObj instanceof MyClass); //=> true
alert(myObjClone instanceof MyClass); //=> false
Est-il une solution pour obtenir un vrai sur la deuxième alerte?
- David, la différence de tous les autres clone questions, c'est que j'ai demandé comment faire pour conserver les objets de type propriété.
Vous devez vous connecter pour publier un commentaire.
jQuery.étendre n'est pas qui vous attend à utiliser l'opérateur instanceof. Il est en train de faire une glorieusement compliqué copie, et non pas un véritable clone. En parcourant les éléments ne sont pas assez. Aussi, appeler le constructeur est préférable de ne pas causer vous perdrez vos arguments. Essayez ceci:
Être conscient que votre prototype points maintenant de retour à l'original (myObj), toute modification de myObj reflètent la myObjClone. Javascript prototypes héritage est un peu délicat. Vous devez être sûr que votre nouvel objet a le bon prototype, et par conséquent, le constructeur.
Admitadly, Javascript rend mon mal à la tête. Pourtant, je pense que je suis en train de lire ce droit, à partir de la Langage ECMAScript spec:
Cette personne semble comprendre le concept beaucoup mieux que moi. K, je vais revenir à java où je nage plus que je ne l'évier 🙂 .
Avez-vous envisagé d'utiliser le clone fonction suggéré ici?
clone
fonction pour obtenir les arguments attendus à partir de? Comment est-il à savoir?Après avoir pris l'inspiration de certaines réponses que j'ai trouvé sur StackOverflow, je suis venu avec une fonction qui est très flexible, et fonctionne même quand l'objet ou de l'une de ses sous-objets a un constructeur avec paramètres requis (grâce à l'Objet.créer).
(Merci à Justin McCandless cela prend désormais en charge cyclique références ainsi.)
Cette fonction est une partie de mon simpleOO bibliothèque; toutes les corrections de bugs ou des améliorations seront apportées là (n'hésitez pas à ouvrir un sujet sur github si vous découvrez certains bug).
$.étendre ne pouvez pas copier toutes les propriétés internes qui ne sont pas visibles (certaines sont visibles dans firefox), mais si
obj.constructor
est correct, et ne sera pas la faute sans args, les propriétés peuvent être définies avecnew obj.constructor()
. Si vous ne l'héritage avec quelque chose commeDerived.prototype = new Base()
, vous avez également besoin de suivre ce avecDerived.prototype.constructor = Derived
pour obtenir le constructeur de droit.Vous pourriez faire
$.extend( true, new obj.constructor(), obj )
, mais il est possible que le constructeur crée les propriétés qui ont été ensuite supprimé, même si vous pourriez obtenir le constructeur args juste, c'est pourquoi les propriétés doivent être supprimés avant de faire l'étendre. Il n'est pas question que le constructeur arguments sont faux puisque les effets de l'original constructeur args -- plus de tout ce qui s'est passé à l'objet depuis lors-sont dans l'objet que nous sommes le clonage.Le problème, c'est que vous êtes de passage dans un nouvel objet à copier à '{}'. C'est pourquoi vous perdez votre type. J'ai trouvé que si vous enveloppez-le véritable objet avant de le transmettre et de le déballer l'objet copié par la suite, étendre à préserver le type comme prévu.
Dans Firefox, vous pouvez écrire:
Peut être utilisé comme:
Réponse a été trouvée ici :source
Mais c'est juste Firefox magie. D'autres navigateurs peuvent crash ici.
Voici une autre solution qui n'est pas exactement la copier ou cloner quoi que ce soit, mais devrait donner les résultats souhaités.
Il utilise du Javascript
bind
fonction de créer un objet qui passe automatiquement dans les paramètres donnés à la MyClass constructeur.J'ai eu des exigences similaires à celles de l'OP et cela a fonctionné pour moi donc, j'ai pensé à la poster, mais je me rends compte que certaines personnes pourraient avoir besoin d'une vrai copie en profondeur sur un objet modifié et cela ne tient pas le projet de loi.