# this Deyimi ile Nesnenin Kendini Referans Etmesi

Nesnelerin metotlarını işlevsel hale getirmek için nesnenin kendini referans etmesi çok kıymetlidir. Önceki örneklerden dönüştürelim.

{% code lineNumbers="true" %}

```javascript
let ogrenci = {
    no:2301,
    isim:'Asya',
    sinif:7,
    kendiniTanit() {
        return `Ben ${this.isim}, numaram ${this.no}, sinifim ${this.sinif}`;
    }
};
alert( ogrenci.kendiniTanit() ); // Asya öğrencisinin bilgileri

let yeniOgrenci = Object.assign( {}, ogrenci );
yeniOgrenci.no = 1491;
yeniOgrenci.isim = 'Ali';
yeniOgrenci.sinif = 8;
alert( yeniOgrenci.kendiniTanit() ); // Ali öğrencisinin bilgileri
```

{% endcode %}

Nesnenin adı yerine **`this`** deyimi ile nesnenin kendisini referans ettik. Metotları haricen oluşturup nesneye değer olarak da atayabiliriz. Yukarıdaki metodu harici bir fonksiyon ile de dönüştürebiliriz. (Çok kullanışlı olmasa da).

{% code lineNumbers="true" %}

```javascript
function kendiniTanit (obj) {
    return `Ben ${obj.isim}, numaram ${obj.no}, sinifim ${obj.sinif}`;
}

let ogrenci = {
    no:2301,
    isim:'Asya',
    sinif:7,
    kendiniTanit:kendiniTanit(this)
    }
};
alert( ogrenci.kendiniTanit() );
```

{% endcode %}

Boş nesneleri fonksiyon olarak "***anahtar:değer***" ikilileri ile değer döndürerek oluşturmak daha kullanışlıdır. Bu da ES6 ile gelen bir yeniliktir. Örnek.

{% code lineNumbers="true" %}

```javascript
function isciOlustur (isim,gorev,maas) {
    return {
        isim, //isim:isim yazmaya gerek yok
        gorev, //gorev:gorevyazmaya gerek yok
        maas //maas:maas yazmaya gerek yok
    };
}

let birIsci = isciOlustur('Ahmet','Usta','10.000')
alert( birIsci.isim );
alert( birIsci.maas);
```

{% endcode %}

Bunu yapabilmemizi sağlayan olay JavaScript dilinde **fonksiyonların bir nesne olarak tasarlanmış olması**dır.&#x20;

**`this`** deyimi sadece nesneleri referans etmez. Referans ettiği öğe, yürütülme esnasında **`.`** işaretinden önce olması gereken öğedir. **`this`** deyiminin sadece nesne ile sınırlı olmadığını bilmeniz gerekir. Şu örneklere bakınız.

{% code lineNumbers="true" %}

```javascript
//Sıkı mod
"use strict";
function isci() {
    return this;
}
alert( isci() ); // undefined
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
// Normal mod
function isci() {
  return this;
}
alert( isci() ); //[object Window] Pencere nesnesi
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
// Sıkı mod
"use strict";
let x = this;
alert(x); //[object Window]
alert(x.length) // 0 'Pencere nesnesinin uzunluğu'
alert(x.location) // bir adres 'Pencere nesnesinin adresi'
```

{% endcode %}

**`this`** deyimi, koşullu operatör veya ok fonksiyonlarıyla kullanılırsa **`this`** **kaybolur**, nesneyi referans edemez. Örnek.

{% code lineNumbers="true" %}

```javascript
//Koşullu operatörlerde
let nesne = {
    isim : 'Kaya',
    sifre : '1234',
    izinsiz: 'İzniniz yok!',
    sifreGoster: this.isim,
    sifreGizle: this.izinsiz,
};
alert( nesne.isim == 'Kaya' ? nesne.sifreGoster : nesne.sifreGizle); //undefined
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
//Ok Fonksiyonlarda
let nesne = {
    isim : 'Kaya',
    izinsiz: 'İzniniz yok!',
    kendiniTanit: let tanit = () => this.isim,
    kendiniGizle: let gizle = () => this.izinsiz,
};
alert( nesne.kendiniTanit() ); //undefined
```

{% endcode %}

**`this`** dile ait bir deyimdir (**`for`**, **`if`** ... gibi) referans ettiği öğeyi biz kontrol edemeyiz.
