JavaScript ile OOP-4

29 Haziran 2014
Posted by Çağatay Yıldız
1418 Views

Javascript OOP yazı dizimizin bu bölümünde js objelerinin metotlarının nasıl override edilebildiğine ve prototype özelliğine bakacağız. Öncelikle bir js objesi oluşturduğumada resimde görüldüğü üzere default olarak bana 7 metot vermekte.

jsoop

Öncelikle Constructor inceleyecek olursak

Constructor
Objemin default olan constructor özelliği ile ufak bir örneği js ile oop-2 yazımızda mevcut.
bir obje oluşturup constructor metodunu sonradan tanımlamamız da mümkün.

    Ninja = new Object()
    var nj = Ninja.constructor("çağatay")
    alert(nj)

Örneği yukarıdaki kod bloğu örneğinde Ninja isimli objemin başlangıçta herhangi bir consructor a sahip değil. Daha sonra “çağatay” string değerini consructor vererek nj isimli yeni objeme atadım. alert çalıştığında ekrana çağatay yazacaktır.(Dilersem nj.toString() metodu ile de çalıştırabilirim)
Gelelim function olarak tanımladığım objemde bu işlemi nasıl yapacağıma

    function Kisi(ad)
    {
        this.ad = ad
        this.soyad = "yıldız"
    }
    ks = new Kisi()
    var ks2 = new ks.constructor("çağatay")
    alert(ks.ad)
    alert(ks2.ad)
    alert(ks2.soyad)

Bu kod bloğunda Kisi isimli objem ad isimli bir değişken almakta. Kisi den instance alıp ks isimli objeme atadım. Sıra geldi instance aldığım objemin constructor değişiklik yapıp başka bir değişkene atamaya. ks2 adlı değişkene kişiyi atarken constructor a “çağatay” string değerini atadım. Artık oluşturdğum son objemin ad isimli değişkeni “çağatay oldu”. ve bu obje soyad değişkenindeki “yıldız”ı da barındırmakta. Sırayla alertler çalıştığında ekrana “undefined”,”çağatay”,”yıldız” yazacaktır. İlk alertte “undefined” yazmasının sebebi ks isimli objemin(ilk instance) constructor boş olması.
Constructor özellik olarak kullanımının bunun dışında iki farklı kullanımı daha mevcuttur. Örneğin sayidizi isimli bir Array tanımadım

    Sayidizi = new Array()

    if (Sayidizi.constructor == Date) {
        alert("bu bir tarihtir")
    }
    else if (Sayidizi.constructor == Object) {
        alert("bu bir objedir")
    }
    else if (Sayidizi.constructor == Array) {
        alert("bu bir dizidir")
    }
    else if (Sayidizi.constructor == Boolean) {
        alert("bu bir boolen değer")
    }
    else if (Sayidizi.constructor == String) {
        alert("bu string bir değerdir")
    }

constructor özelliği benim objemin tipinide barındırmaktadır. Burada alert olarak ekrana “bu bir objedir” yazması beklenirken” 3. if bloğunun içerisinde bulunan “bu bir dizidir” yazacak. javascript oop dil olmasına karşın “everything’s an object” anlayışının birebir aynı olmadığı gözlemlenmekte.
Constuctor son kullanımına gelirsek

    function Ninja(ad) {
        this.ad = ad;
        this.KilicTur = "Hattori Hanzo"
        this.OyundaMi = true
    }

    var nj = new Ninja("çağatay")
    alert(nj.constructor)

alert ekrana şöyle bir yazı yazmaktajsoop-2
Ekrana direk bizim fonksiyonumuzu yazmakta.Bu arada Fonksiyonun yazması için Ninjamın ad isimli değişkenini atama gibi bir zorunluluğumuz yok. Böylelikle constructor özelliğinden fonksiyonu direk yakalamış olduk. Objemizi fonksiyon olarak değil new object şeklinde oluşturmuş olsaydık yani;

    Samuray = new Object()
    alert(Samuray.constructor)

bu durumda ise ekrandaki sonuç
jsoop3
şeklinde olacaktı.