JavaScript'te Nesne Dönen Fonksiyonların Instance Invocation'unda Prototipin Değişimi
16 Mar 2014Selamlar,
Bu aralar Douglas Crockford’un “JavaScript: The Good Parts”ını okuyorum. Daha önce okumamış olmamın verdiği utançla buraya yazmaktan da çekindim aslında :)
Kitabın “function invocation” ile alakalı kısmında Crockford ilginç bir detaydan bahsediyor:
If the function was invoked with the
new
prefix and thereturn
value is not an object, thenthis
(the new object) is returned instead.
Burada ilgimi çeken detay “return
value is not an object” kısmı oldu. Hemen neymiş ne değilmiş denemek istedim, çünkü bilmediğim bir özellikti.
Normalde, bildiğiniz gibi, bir fonksiyon “new
” keyword’ü ile çağırılırsa ilgili fonksiyonun prototype
nesnesine bir link dönüyor ve bu sayede klasik OOP gibi çalışabiliyoruz.
Normalde bu durumda hepimizin bildiği gibi, eğer Foo
fonksiyonunu new
ile çağırırsak çıktıda hello
değerine erişebileceğiz.
Eğer başka herhangi bir değer dönersek yine de prototype
dönmeye devam edecekti.
Eğer new
ile çağırırsak,
Eğer normal olarak çağırırsak,
çıktısı alacağız. Yani, fonksiyon bir string dönerse JavaScript bunu dikkate almayacak ve yine “prototype” nesnesini dönecek.
Şimdi gelelim esas noktaya;
Bu durumda bugüne kadar bana “bunu new
ile invoke edersen ne döner” diye sorsanız, “fonksiyon’un prototype’ı” derdim fakat öyle değilmiş :)
Eğer nesne dönmek zorundaysam ve “string” bir nesne değilse, bu noktada şunu denemek ilk aklıma gelen şey oldu:
Bu noktada gerçekten string dönebiliyoruz, fakat “toString
” kullanarak birleştirmek gerekiyor.
this
nesnesinin new
nesnesine göre nasıl farklı invokasyona uğradığına dair bir deneme daha yapalım:
Küçük bir detay. Muhtemelen kitabı okuyan bir çok arkadaşın çok önceden bildiği bir durumdu, fakat bilmenin gerçekten faydalı olabileceği noktalar olacağına eminim.