> For the complete documentation index, see [llms.txt](https://hanuce.gitbook.io/javascript-egitimi/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hanuce.gitbook.io/javascript-egitimi/referans-reference-veri-tipleri/object-nesne/object.assign-ile-nesne-birlestirme-ve-klonlama.md).

# Object.assign() ile Nesne Birleştirme ve Klonlama

Bir nesnenin özellikleri ve değerleri doğrudan atanabildiği gibi **`Object`** sınıfının **`.assign()`** metodu ile (**`Object.assign()`** ) de atanabilir. Örnek.

{% code lineNumbers="true" %}

```javascript
let isci = {
    sicilNo:2023,
    isim:'Ahmet',
    gorev:'Ustabaşı'
};
//isci nesnesine kidem ve maas özelliklerini değerleriyle ekledik.
Object.assign( isci, { kidem:15, maas:9000 } );
alert(isci.maas); //9000 çıktısı verir.
```

{% endcode %}

İlk argüman nesnenin kendisi olurken gerisi de nesne tipinde 'anahtar:değer' ikilileridir. Yani **`Object.assign(object, Object)`** olarak argümanlar almaktadır.

Var olan bir özelliği **`.assign()`** ile atarsanız var olanın **üzerine yazar**. Örnek.

{% code lineNumbers="true" %}

```javascript
let isci = {
    sicilNo:2023,
    isim:'Ahmet',
    gorev:'Ustabaşı'
};
Object.assign( isci, { gorev:'İşçi', maas:9000 } );
alert(isci.gorev); //'İşçi' çıktısı verir.
alert(isci.maas); //'9000' çıktısı verir.
```

{% endcode %}

**`Object.assign()`** ile **farklı nesneler birleştirilebilir.** Örnek.

{% code lineNumbers="true" %}

```javascript
let isci = {
    tcNo:12345678900,
    isim:'Güneş Gün',
};
let metrik = {
    kidem:15,
    maas:12000,
};
Object.assign(isci, metrik);
alert(isci.kidem); //'15' çıktısı verir.
```

{% endcode %}

Bu fonksiyon klonlama için de kullanılır. **Klonlama orijinalden bağımsız bir kopya oluşturmaktır.** Referans tipler değeri değil adresi taşıdığı için yapılan değişikliklerden etkilenir. Daha iyi anlamak için şu örneğe bakınız.

<table data-card-size="large" data-view="cards" data-full-width="false"><thead><tr><th></th></tr></thead><tbody><tr><td><pre class="language-javascript" data-line-numbers data-full-width="true"><code class="lang-javascript">//İLKEL (DEĞER) TİP
let str = 'Değer';
let yeni = str;
alert(yeni); // 'Değer'
str = 'Yeni Değer';
//atanadığı değişkenin
//değerinin değişmesinden
//etkilenmez.
alert(yeni); // 'Değer'
</code></pre></td></tr><tr><td><pre class="language-javascript" data-line-numbers data-full-width="true"><code class="lang-javascript">//REFERANS (ADRES) TİP
let obj = { p1:'Değer'};
let yeni = obj;
alert(yeni.p1); // 'Değer'
obj.p1 = 'Yeni Değer';
//atanadığı nesnenin
//değerinin değişmesinden
//etkilenir.
alert(yeni.p1); // 'Yeni Değer'
</code></pre></td></tr></tbody></table>

Nesnelerin birbirini referans etmeyen **bağımsız kopyalarını** oluşturup üzerinde çalışmak için **`Object.assign()`** fonksiyonunun **ilk argümanını boş nesne** bırakarak oluşturabilirsiniz. Örnek.

{% code lineNumbers="true" %}

```javascript
let isci = {
    tcNo:12345678900,
    isim:'Çetin KAYA',
    kidem:15,
    maas:12000,
};

let yeniIsci = Object.assign( {}, isci );
alert(yeniIsci.tcNo); //12345678900
isci.tcNo = 00000000000;
alert(yeniIsci.tcNo); //12345678900 etkilenmedi, bağımsız bir kopya (klon)
```

{% endcode %}

Fakat bu kolaylık değerlerde nesne kullanılmışsa işe yaramaz. Örnek.

{% code lineNumbers="true" %}

```javascript
let isci = {
    tcNo:12345678900,
    isim:'Çetin KAYA',
    metrik:{
        kidem:15,
        maas:12000,
    }
};
let yeniIsci = Object.assign( {}, isci );
alert(yeniIsci.metrik.kidem); // '15'
isci.metrik.kidem = 5;
alert(yeniIsci.metrik.kidem); // '5', etkilendi, değerdeki nesneler klon olamadı.
```

{% endcode %}

Bu problem ***lodash.js*** kitaplığındaki **`.cloneDeep()`** metodu ile çözülebilir. Daha fazlası için bakınız: <https://lodash.com/>
