Typescript/Angular/ES6: for döngülerinde `hasOwnProperty()`'yi nihayet bırakabilir miyim?


Javascript'te nesneler üzerinde dönerken hasOwnProperty()'yi kontrol etme ihtiyacını her zaman sevmedim:

for ( var key in object ) {
    if ( !object.hasOwnProperty( key ) ) {
        continue;
    }

    // Now I can do whatever I needed to do
}

Bir nesnedeki anahtarlar üzerinde döngü yapmak ve sonra bu anahtarların başka bir yerden gelmediğinden emin olmak için açıkça kontrol etmek her zaman boşa harcanmış dikey alan gibi görünüyor. Javascript'te bunun neden gerekli olduğunu açıkça biliyorum, özellikle bazen prototip zincirine bir şeyler enjekte eden eski kütüphaneler nedeniyle (örneğin Prototype).

Bana bildiğim kadarıyla, Angular böyle bir şey yapmıyor. Typescript'in de böyle bir nedeni olmazdı. Hiçbir modern JavaScript framework'ünün bunu yapabileceğini hayal edemiyorum. Sonuç olarak, modern bir Angular uygulamasında (veya herhangi bir modern JavaScript uygulamasında) böyle bir kontrolü atlamanın muhtemel olumsuz yönleri nelerdir? Risk sadece kendi ekibimin prototipleri yanlışlıkla değiştirmesinden (veya prototipleri değiştiren kütüphaneleri yanlışlıkla içe aktarmasından) mi kaynaklanıyor, yoksa farkında olmadığım başka sorunlar da olabilir mi? Prototip zincirinin bana başka hangi şekillerde sorun çıkarabileceğini, bunu yapmaya çalıştığımda nasıl deneyimleyebilirim?

for ( let key in object ) {
}

Kendi testlerim herhangi bir sorun ortaya çıkarmadı, ama belki de gözden kaçırdığım bariz bir şey vardır. Ve evet, modern js/ts'de Object.keys(object)'in farkındayım. İşi hallediyor ama bence bir for ... in kadar temiz değil, ki hasOwnProperty()'yi bırakabilirsem onu kullanmayı tercih ederim.

Cevap #1

Düz nesneleri ve kalıtılmış sayılabilir özelliği olmadığını bildiğiniz diğer nesneleri listelerken bu kontrolü eklemek için kesinlikle hiçbir sebep yok. Haklısınız, hiçbir makul modern çerçeve bunu Object.prototype için yapmaz.

2012'den bu yana hasOwnProperty kontrollerinin ölümü ilan edilmiştir :-)

Sadece kendi ekibimin yanlışlıkla prototipleri değiştirmesi (veya prototipleri değiştiren kütüphaneleri yanlışlıkla içe aktarması) nedeniyle sorun riskiyle mi karşı karşıyayım?

Evet. Bu tür sorunların çözümü, prototipleri değiştirmek (veya özelliği sıra dışı hale getirmek) değil, her yere hasOwnProperty kontrolleri eklemek de değildir.

Yoksa benim farkında olmadığım başka sorun alanları mı var?

Hayır.

Aslında, if (!object.hasOwnProperty(key)) kontrolünü atlamak bazı sorunları çözüme kavuşturabilir ve sıkıntılardan kaçınabilir. Numaralandırmak isteyebileceğiniz tüm nesnelerin bir hasOwnProperty yöntemi olduğu veya beklediğiniz işi yapan bir yöntemi bulunduğu garantisi yoktur. Gerekli olduğu durumlarda doğru kontrol yöntemi her zaman call ile olmuştur:

if (!Object.prototype.hasOwnProperty.call(object, key))

(tabii ki hâlâ bazı uç durumlar var, ama bunlar object'e bağlı değil)

İlgili makaleler