|
| 1 | +## Nesne Oluşturucular |
| 2 | + |
| 3 | +JavaScript'te oluşturucular diğer dillerden farklıdır. Başında `new` bulunan |
| 4 | +her fonksiyon çağrısı bir oluşturucudur. |
| 5 | + |
| 6 | +Oluşturucunun (çağırılan fonksiyonun) içinde `this` 'in değeri yeni yaratılan |
| 7 | +`Object` 'dir. Bu **yeni** nesnenin [`prototipi`](#object.prototype) oluşturucu |
| 8 | +olarak çağrılan fonksiyon nesnesinin prototipidir. |
| 9 | + |
| 10 | +Çağrılan fonksiyonda bir `return` ifadesi yoksa, `this` (yani yeni nesneyi) |
| 11 | +döndürür. |
| 12 | + |
| 13 | + function Foo() { |
| 14 | + this.bla = 1; |
| 15 | + } |
| 16 | + |
| 17 | + Foo.prototype.test = function() { |
| 18 | + console.log(this.bla); |
| 19 | + }; |
| 20 | + |
| 21 | + var test = new Foo(); |
| 22 | + |
| 23 | +Yukarıdaki program `Foo` oluşturucusunu çağırır ve yeni yaratılan nesnenin |
| 24 | +`prototipini` `Foo.prototype` olarak belirler. |
| 25 | + |
| 26 | +Oluşturucunun içinde bir `return` ifadesi bulunması durumunda, **ve sadece** |
| 27 | +bu değer bir `Object` ise oluşturucu fonksiyon verilen değeri döndürür. |
| 28 | + |
| 29 | + function Bar() { |
| 30 | + return 2; |
| 31 | + } |
| 32 | + new Bar(); // yeni bir Bar nesnesi |
| 33 | + |
| 34 | + function Test() { |
| 35 | + this.value = 2; |
| 36 | + |
| 37 | + return { |
| 38 | + foo: 1 |
| 39 | + }; |
| 40 | + } |
| 41 | + new Test(); // döndürülen nesne |
| 42 | + |
| 43 | +`new` anahtar kelimesi ihmal edilirse, fonksiyon yeni bir nesne **döndürmez**. |
| 44 | + |
| 45 | + function Foo() { |
| 46 | + this.bla = 1; // global nesnenin özelliğini değiştirir |
| 47 | + } |
| 48 | + Foo(); // undefined |
| 49 | + |
| 50 | +Yukarıdaki örnek bazı durumlarda doğru çalışıyor gibi görünebilir, ama |
| 51 | +JavaeScript'te [`this`](#function.this) 'in çalışma şeklinden dolayı `this` |
| 52 | +'in değeri *global nesne* olacaktır. |
| 53 | + |
| 54 | +### Nesne fabrikaları |
| 55 | + |
| 56 | +`new` anahtar kelimesini ihmal edebilmek için oluşturucu fonksiyonun bir değer |
| 57 | +döndürmesi gerekir. |
| 58 | + |
| 59 | + function Bar() { |
| 60 | + var value = 1; |
| 61 | + return { |
| 62 | + method: function() { |
| 63 | + return value; |
| 64 | + } |
| 65 | + } |
| 66 | + } |
| 67 | + Bar.prototype = { |
| 68 | + foo: function() {} |
| 69 | + }; |
| 70 | + |
| 71 | + new Bar(); |
| 72 | + Bar(); |
| 73 | + |
| 74 | +Yukarıda `Bar` fonksiyonunu çağıran her iki ifade de aynı şeyi döndürecektir: |
| 75 | +`method` adında bir [Closure](#function.closures) özelliği olan yeni yaratılmış |
| 76 | +bir nesne. |
| 77 | + |
| 78 | +Başka bir nokta da `new Bar()` fonksiyonunun döndürülen nesnenin prototipini |
| 79 | +**etkilememesidir**. Yeni nesnenin prototipi oluşturulacaktır ancak `Bar` bu |
| 80 | +nesneyi döndürmez. |
| 81 | + |
| 82 | +Yukarıdaki örnekte `new` anahtar kelimesini kullanmakla kullanamamak arasında |
| 83 | +hiçbir bir fark yoktur. |
| 84 | + |
| 85 | +### Fabrikalar ile yeni nesneler oluşturmak |
| 86 | + |
| 87 | +`new` anahtar kelimesinin **kullanılmaması** tavsiye olunur, çünkü unutulması |
| 88 | +durumu hatalara sebep olabilir. |
| 89 | + |
| 90 | +Bunun yerine yeni bir nesne oluşturmak için bir fabrika kullanılmalıdır. |
| 91 | + |
| 92 | + function Foo() { |
| 93 | + var obj = {}; |
| 94 | + obj.value = 'blub'; |
| 95 | + |
| 96 | + var private = 2; |
| 97 | + obj.someMethod = function(value) { |
| 98 | + this.value = value; |
| 99 | + } |
| 100 | + |
| 101 | + obj.getPrivate = function() { |
| 102 | + return private; |
| 103 | + } |
| 104 | + return obj; |
| 105 | + } |
| 106 | + |
| 107 | +Yukarıdaki örnek hem `new` anahtar kelimesinin unutulmasından etkilenmez hem de |
| 108 | +[private değikenlerin](#function.closures) kullanılmasını kolaylaştırır, ama |
| 109 | +bazı dezavantajları da vardır. |
| 110 | + |
| 111 | + 1. Oluşturulan nesneler bir prototip üzerinde metotlarını **paylaşmadıkları** |
| 112 | + için daha fazla hafıza kullanılır. |
| 113 | + 2. Başka bir sınıf türetmek için fabrikanın tüm metotları başka bir nesneden |
| 114 | + kopyalaması veya bu nesneyi yeni nesnenin prototipine yerleştirmesi gerekir. |
| 115 | + 3. Sadece `new` anahtar kelimesinin ihmal edilmesinden kaynaklanacak sorunları |
| 116 | + gidermek için prototip zincirinden vazgeçmek dilin ruhuna aykırıdır. |
| 117 | + |
| 118 | +### Sonuç |
| 119 | + |
| 120 | +`new` anahtar kelimesini ihmal etmek hatalara neden olabilir, fakat bu |
| 121 | +kesinlikle prototip zincirinden vazgeçmek için bir neden **olamaz**. Hangi |
| 122 | +çözümün belirli bir programa uygun olduğu kararını verirken, en önemli nokta |
| 123 | +nesne oluşturmak için belirli bir yöntemi seçip bu çözüme **bağlı kalmaktır**. |
| 124 | + |
0 commit comments