> 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/nesnelerde-fonksiyon-kullanimi-ve-callback.md).

# Nesnelerde Fonksiyon Kullanımı ve Callback

Nesnelerdeki anahtarların değerleri anonim bir fonksiyon olabilir. Örnek.

{% code lineNumbers="true" %}

```javascript
let ogrenci = {
  no:2301,
  isim:'Asya',
  sinif:7,
  kendiniTanit:function () {
    return `Ben ${ogrenci.isim}, numaram ${ogrenci.no}, sinifim ${ogrenci.sinif}`;
  }
};
alert(ogrenci.kendiniTanit);
```

{% endcode %}

Fonksiyonu olduğu gibi **`string`** olarak gördük. O zaman bu fonksiyonu **callback** yapabiliriz. Hadi sonuna **`()`** koyarak deneyiniz.

{% code lineNumbers="true" %}

```javascript
alert( ogrenci.kendiniTanit() ); //callback
```

{% endcode %}

Değeri fonksiyon olan özelliklere "**nesnenin metodu**" diyoruz. Bu metotları da **callback** ile yürütebiliyoruz.&#x20;

Nesnelerde değer olarak kullandığımız fonksiyonlar (yani nesnenin metodu) değer döndürmek zorunda değildir. **Değersiz fonksiyonlar** kullanarak 'yerinde' işlemler de yapabiliriz. Örnek.

{% code lineNumbers="true" %}

```javascript
let isci = {
    tcNo:12345678900,
    isim:'Güneş Gün',
    kidem:15,
    maas:12000,
    maasArtir: function () {
        let miktar = prompt("Yeni maaşı giriniz:",isci.maas);
        isci.maas = miktar;
    } // return kullanmadık (değersiz fonksiyon)
};

alert(isci.maas); // 120000
isci.maasArtir(); //callback
alert(isci.maas); // girdiğiniz miktar
```

{% endcode %}

ES6 ile gelen yeniliklerden biri de bir nesne içinde bir fonksiyon (metot) yazarken anahtar tanımlamaya ve **`function`** deyimi yazmaya gerek olmamasıdır. Yani örnek olarak.

{% code lineNumbers="true" %}

```javascript
let ogrenci = {
  no:2301,
  isim:'Asya',
  sinif:7,
  kendiniTanit() { // 'function' deyimi olmadan doğrudan yazdık.
    return `Ben ${ogrenci.isim}, numaram ${ogrenci.no}, sinifim ${ogrenci.sinif}`;
  }
};
alert( ogrenci.kendiniTanit() );
```

{% endcode %}

Bu kullanımda fonksiyon adı doğrudan özellik (anahtar) olur. Ayrıca **`function`** deyimi kullanmanıza da gerek kalmaz. Bu sebeple daha okunaklı ve kısadır.

Klon nesnelerin içindeki metotlar (fonksiyonlar), nesne isimleri değişeceği için (isci1, isci2 vb.) metotlar çalışmaz. Yani:

{% code lineNumbers="true" %}

```javascript
let ogrenci = {
  no:2301,
  isim:'Asya',
  sinif:7,
  kendiniTanit() {
    return `Ben ${ogrenci.isim}, numaram ${ogrenci.no}, sinifim ${ogrenci.sinif}`;
  }
};

let yeniOgrenci = Object.assign( {}, ogrenci );
yeniOgrenci.no = 1491;
yeniOgrenci.isim = 'Ali';
yeniOgrenci.sinif = 8;
alert( yeniOgrenci.kendiniTanit() ); // kopyalandığı öğrencinin bilgilerini verir
```

{% endcode %}

Dolayısıyla her nesnede aynı metodu nesne ismi ile yeniden yazmak gerekir mi?

Hayır. Bunu yapmak saçmadır. Bu problemi **`this`** deyimi ile çözeriz.
