# 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/>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hanuce.gitbook.io/javascript-egitimi/referans-reference-veri-tipleri/object-nesne/object.assign-ile-nesne-birlestirme-ve-klonlama.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
