Prototipin uzantılarının yapılması tavsiye edilmez, Kodunuz / bileşenleriniz üzerinde testler yapacağınız zaman sorunlara neden olacaktır. Birim testi çerçeveleri otomatik olarak sizin prototip uzantılarınızı üstlenmez. Yani bu iyi bir uygulama değil. Burada prototip uzantılarının daha fazla açıklaması var Yerel nesneleri genişletmek neden kötü bir uygulama?
JavaScript'te nesneleri klonlamanın basit veya doğrudan bir yolu yoktur. "Sığ Kopya" kullanan ilk örnek:
1 -> Sığ 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';
Sonuçlar:
original.logFullName ():
sonuç: Cassio Seffrin
clone.logFullName ():
sonuç: John Seffrin
original.address.street;
sonuç: 'Sokak B, 99' // orijinal alt nesnenin değiştirildiğine dikkat edin
Uyarı: Örneğin, kendi özellikleri olarak kapanışlara sahipse, bu yöntem onu sarmaz. ( kapanışlar hakkında daha fazlasını okuyun ) Ve artı, "adres" alt nesnesi klonlanmayacaktır.
clone.logFullName ()
çalışmayacak.
cloneWithPrototype.logFullName ()
çalışacak, çünkü klon aynı zamanda Prototiplerini de kopyalayacaktır.
Object.assign ile dizileri klonlamak için:
let cloneArr = array.map((a) => Object.assign({}, a));
ECMAScript yayılma sintax kullanarak dizi klonlayın:
let cloneArrSpread = array.map((a) => ({ ...a }));
2 -> Derin Klon:
Tamamen yeni bir nesne referansını arşivlemek için, orijinal nesneyi dize olarak ayrıştırmak için JSON.stringify () kullanabiliriz ve sonra onu tekrar JSON.parse () olarak ayrıştırabiliriz.
let deepClone = JSON.parse(JSON.stringify(original));
Derin klonlama ile adres referansları korunacaktır. Ancak deepClone Prototipleri kaybedilecek, bu nedenle deepClone.logFullName () çalışmayacaktır.
3 -> 3. taraf kitaplıkları:
Diğer seçenekler, yükleme veya alt çizgi gibi 3. taraf kitaplıklarını kullanmak olacaktır. Yeni bir nesne oluştururlar ve her değeri orijinalden yeni nesneye referanslarını bellekte tutarak kopyalarlar.
Alt Çizgi: let cloneUnderscore = _ (orijinal) .clone ();
Loadash klonu: var cloneLodash = _.cloneDeep (orijinal);
Lodash veya alt çizginin dezavantajı, projenize bazı ekstra kütüphaneler dahil etme ihtiyacıydı. Ancak iyi seçeneklerdir ve aynı zamanda yüksek performanslı sonuçlar üretirler.