Suite à la réponse de @marcel, j'ai trouvé que certaines fonctions manquaient toujours sur l'objet cloné. par exemple
function MyObject() {
var methodAValue = null,
methodBValue = null
Object.defineProperty(this, "methodA", {
get: function() { return methodAValue; },
set: function(value) {
methodAValue = value || {};
},
enumerable: true
});
Object.defineProperty(this, "methodB", {
get: function() { return methodAValue; },
set: function(value) {
methodAValue = value || {};
}
});
}
où sur MyObject je pourrais cloner methodA mais methodB a été exclu. Cela s'est produit parce qu'il manque
enumerable: true
ce qui signifiait qu'il n'apparaissait pas dans
for(let key in item)
Au lieu de cela, je suis passé à
Object.getOwnPropertyNames(item).forEach((key) => {
....
});
qui comprendra des clés non énumérables.
J'ai également constaté que le prototype ( proto ) n'était pas cloné. Pour cela, j'ai fini par utiliser
if (obj.__proto__) {
copy.__proto__ = Object.assign(Object.create(Object.getPrototypeOf(obj)), obj);
}
PS: Frustrant que je n'ai pas pu trouver une fonction intégrée pour faire cela.
original = { a: [1,2,3] }
vous donne un clone avecclone.a
être littéralementoriginal.a
. Modification via l'unclone
ou l' autre ouoriginal
modifie la même chose , donc non, c'est mauvais =)