Nie jest zalecane tworzenie rozszerzeń Prototypu, spowoduje to problemy podczas wykonywania testów na kodzie / komponentach. Struktury testów jednostkowych nie przyjmą automatycznie twoich prototypowych rozszerzeń. Więc to nie jest dobra praktyka. Więcej wyjaśnień dotyczących prototypowych rozszerzeń jest tutaj. Dlaczego rozszerzanie obiektów natywnych jest złą praktyką?
Nie ma prostego ani prostego sposobu na klonowanie obiektów w JavaScript. Oto pierwszy przypadek użycia „Shallow Copy”:
1 -> Płytki klon:
class Employee {
constructor(first, last, street) {
this.firstName = first;
this.lastName = last;
this.address = { street: street };
}
logFullName() {
console.log(this.firstName + ' ' + this.lastName);
}
}
let original = new Employee('Cassio', 'Seffrin', 'Street A, 23');
let clone = Object.assign({},original);
let cloneWithPrototype Object.create(Object.getPrototypeOf(original)), original)
let clone2 = { ...original };
clone.firstName = 'John';
clone.address.street = 'Street B, 99';
Wyniki:
original.logFullName ():
wynik: Cassio Seffrin
clone.logFullName ():
wynik: John Seffrin
original.address.street;
wynik: 'Street B, 99' // zauważ, że oryginalny obiekt podrzędny został zmieniony
Uwaga: Jeśli instancja ma domknięcia jako własne właściwości, ta metoda jej nie zawinie. ( przeczytaj więcej o domknięciach ) Ponadto podobiekt „address” nie zostanie sklonowany.
clone.logFullName ()
nie będzie działać.
cloneWithPrototype.logFullName ()
zadziała, ponieważ klon skopiuje również swoje prototypy.
Aby sklonować tablice za pomocą Object. assign:
let cloneArr = array.map((a) => Object.assign({}, a));
Klonuj macierz za pomocą sintax rozszerzania ECMAScript:
let cloneArrSpread = array.map((a) => ({ ...a }));
2 -> Głęboki klon:
Aby zarchiwizować zupełnie nowe odniesienie do obiektu, możemy użyć JSON.stringify () do przeanalizowania oryginalnego obiektu jako ciągu znaków, a po przeanalizowaniu go z powrotem do JSON.parse ().
let deepClone = JSON.parse(JSON.stringify(original));
Dzięki głębokiemu klonowaniu odniesienia do adresu zostaną zachowane. Jednak prototypy deepClone zostaną utracone, dlatego metoda deepClone.logFullName () nie będzie działać.
3 -> Biblioteki stron trzecich:
Inną opcją będzie użycie bibliotek innych firm, takich jak loadash lub podkreślenie. Tworzą nowy obiekt i kopiują każdą wartość z oryginału do nowego obiektu, zachowując odniesienia w pamięci.
Podkreślenie: niech cloneUnderscore = _ (oryginał) .clone ();
Loadash clone: var cloneLodash = _.cloneDeep (oryginał);
Wadą lodash lub podkreślenia była konieczność włączenia do projektu kilku dodatkowych bibliotek. Są to jednak dobre opcje, a także zapewniają wysoką wydajność.