Kontynuując odpowiedź @marcel, stwierdziłem, że w sklonowanym obiekcie nadal brakuje niektórych funkcji. na przykład
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 || {};
}
});
}
gdzie na MyObject mogłem sklonować metodę MethodA, ale metodaB została wykluczona. Stało się tak, ponieważ go brakuje
enumerable: true
co oznaczało, że nie pojawił się w
for(let key in item)
Zamiast tego przeszedłem na
Object.getOwnPropertyNames(item).forEach((key) => {
....
});
który będzie zawierał nie wyliczalne klucze.
Odkryłem również, że prototyp ( proto ) nie został sklonowany. W tym celu użyłem
if (obj.__proto__) {
copy.__proto__ = Object.assign(Object.create(Object.getPrototypeOf(obj)), obj);
}
PS: Frustrujące, że nie mogłem znaleźć wbudowanej funkcji do tego.
original = { a: [1,2,3] }
daje klon zclone.a
dosłownie bytemoriginal.a
. Modyfikacja poprzez jednąclone
luboriginal
modyfikację tego samego , więc nie, to jest złe =)