paint-brush
JavaScript Nesneleri: Temellerden İleri Tekniklereile@smakss
3,785 okumalar
3,785 okumalar

JavaScript Nesneleri: Temellerden İleri Tekniklere

ile Max Kazemi17m2024/03/07
Read on Terminal Reader

Çok uzun; Okumak

JS nesnelerini keşfedin: Türleri anlayın, nesneleri oluşturun ve yönetin, eşitlik kontrollerini, prototip mirasını derinlemesine inceleyin ve temel yardımcı program işlevlerini kullanın.
featured image - JavaScript Nesneleri: Temellerden İleri Tekniklere
Max Kazemi HackerNoon profile picture
0-item
1-item
2-item

JavaScript'in Özünü Anlamak: İlkeller ve Nesneler

Çeşitli ve esnek veri türlerinden oluşan bir dil olan JavaScript, temel olarak iki kategoriye ayrılır: İlkeller ve Nesneler . Bu ayrım, JavaScript'in üzerinde çalıştığı temeli oluşturduğundan, her düzeydeki geliştiricilerin kavraması çok önemlidir. Anlayışımızı sağlamlaştırmak için bu kavramları tekrar gözden geçirelim.


İlkel Değerler: Temeller

  • String : "hello" ve "farewell" gibi metin verileri, tırnak işaretleri içine alınır ve JavaScript'te metin manipülasyonunun temel taşı görevi görür.


  • Sayı : İster tamsayılar ( -5 ) ister ondalık sayılar ( 3.14 ) olsun, Sayılar dildeki matematiksel işlemlerin temelidir.


  • BigInt : Number'ın güvenli tam sayı sınırının ötesindeki hesaplamalar için BigInt devreye girerek büyük tam sayılar üzerinde hassas aritmetiğe olanak tanır.


  • Boolean : Boolean türü, doğru ve yanlış değerleriyle mantıksal işlemler ve kontrol akışları için çok önemlidir.


  • Tanımsız : Bir değer atanmamış bir değişkene otomatik olarak tanımsız değeri verilir; bu, belirli bir bağlamda bir değerin bulunmadığını gösterir.


  • Sembol : Benzersiz özellik anahtarları sağlamak için sunulan Semboller değişmez ve benzersizdir, nesnelere çarpışmayan özellikler eklemek için idealdir.


  • Null : Herhangi bir nesne değerinin kasıtlı olarak yokluğunu temsil eder. Tanımlanmamışın aksine null, 'değer yok'u belirtmek için açıkça atanır.


İlkeller değişmezdir , yani değerleri oluşturulduktan sonra değiştirilemez. Bu özellik çoğu zaman kafa karışıklığına yol açar, özellikle de ilkel bir değer taşıyan bir değişkeni değerin kendisiyle karıştırdığımızda.


İlkellerin değişmez olduğunu anlamak, özellikle karşılaştırma ve atama işlemlerinde JavaScript davranışının birçok yönünü açıklığa kavuşturmaya yardımcı olur.


JavaScript yolculuğumuzda, bu türlerden bazılarını doğrudan kullanamasak da, rollerini tanımak ve anlamak, kodlama araç setimizi zenginleştirerek daha karmaşık ve verimli kodların önünü açar.


İlkellerin ötesinde, JavaScript evrenine Nesneler hakimdir. Bu kategori, Arrays gibi bazıları sizi şaşırtabilecek çok çeşitli veri yapılarını kapsar. Öncelikle şunu görüyoruz:


  • Nesneler : Standart nesneler için {} veya diziler için [] ile temsil edilen bu yapılar, ilgili verilerin ve işlevlerin gruplandırılmasının omurgasıdır.


  • İşlevler : Diğerlerinin yanı sıra x => x * 2 olarak ifade edilen işlevler, JavaScript'teki birinci sınıf vatandaşlardır ve kodun değişkenlere atanmasına, argüman olarak iletilmesine veya diğer işlevlerden döndürülmesine olanak tanır.


Nesneler temel olarak ilkellerden farklıdır; değiştirilebilirler ve doğrudan kodumuzda değiştirilebilirler. Yaygın bir yanılgı, JavaScript'teki her şeyi bir nesne olarak görmektir. Bu, ilkel değerlerin belirli nesne benzeri davranışları nedeniyle kısmen doğrudur. Örneğin, "hi".toUpperCase() ifadesi şu soruları gündeme getirebilir: İlkel bir dize nasıl yöntemlere sahip olabilir?


Bu, "boxing" olarak bilinen bir işlem yoluyla gerçekleşir; burada JavaScript, yalnızca işlem tamamlandığında bu nesneleri atmak için, yöntemlere erişmek için nesne sarmalayıcılardaki ilkel değerleri geçici olarak sarar.


Bu, JavaScript'in tasarımının büyüleyici bir yönüdür ve ilkellerin aslında nesne olmadan nesne benzeri yöntemlerden yararlanmasına olanak tanır. JavaScript'in tipolojisini daha derinlemesine incelerken bu ayrımı anlamak çok önemlidir.

JavaScript'in Operatör typeof ve benzersiz null durumunu keşfetme

JavaScript'teki çeşitli veri türleri arasında ayrım yapmak bazen biraz sihir gibi gelebilir. JavaScript araç setinizde belirli bir değerin türünü ortaya çıkaran güçlü bir araç olan typeof operatörünü girin. Uygulamada şu şekilde çalışır:


 console.log(typeof(5)); // Outputs "number" console.log(typeof("hi")); // Outputs "string" console.log(typeof(undefined)); // Outputs "undefined" console.log(typeof({})); // Outputs "object" console.log(typeof([])); // Outputs "object" console.log(typeof(x => x * 2)); // Outputs "function"


Ancak JavaScript alanında her şey göründüğü gibi görünmüyor. Örneğin typeof operatörünün null değerini ele almasını ele alalım. Beklentilere rağmen, typeof null "object" değerini döndürür, bu da birçok geliştiricinin kafasını karıştıran bir sonuçtur. Bu davranış bir hatadan ziyade dilin bir tuhaflığıdır ve kökleri JavaScript'in ilk tasarım kararlarına dayanmaktadır.


null değeri, herhangi bir nesne değerinin kasıtlı olarak yokluğunu temsil etmek içindir, ancak typeof onu bir nesne olarak sınıflandırır. Bu tuhaflık iyi bilinmektedir ve geriye dönük uyumlulukla ilgili endişeler nedeniyle JavaScript'in gelişimi boyunca devam etmiştir.


Atanmamış değerleri ifade eden undefined farklı olarak null , kasıtlı olarak 'değer yok' atamasını belirtmek için açıkça kullanıldığını hatırlamak çok önemlidir. JavaScript, null ve undefined arasındaki kullanım ayrımını zorunlu kılmasa da, kodunuza tutarlı bir yaklaşım benimsemek, amacınızı netleştirmenize ve hem okunabilirlik hem de sürdürülebilirlik açısından yardımcı olabilir.

JavaScript'teki İfadeleri Anlamak: Kodunuzla Bir Diyalog

JavaScript'in canlı dünyasında kod yazmak soru sormaya benzer ve dil yanıtlarla yanıt verir. Bu etkileşimler ifadeler dediğimiz şeyler aracılığıyla yakalanır. JavaScript'teki bir ifade, bir değere çözümlenen herhangi bir geçerli kod birimidir.


Basit bir örneğe bakalım:


 console.log(5 + 5); // Outputs 10


Bu örnekte 5 + 5 , javascript'in 10 değeriyle değerlendirdiği bir ifadedir.


İfadeler, programlarınız içinde dinamik etkileşimleri ve hesaplamaları mümkün kılan, JavaScript kodunun yapı taşlarıdır. Yukarıdaki örnek kadar basit veya daha karmaşık olabilirler. Aslında ifadeler, etkileşimli, dinamik web uygulamaları oluşturmak için dille doğrudan iletişim hattınızdır.

JavaScript'te Nesne Oluşturma: Çağırma'dan Çöp Toplama'ya

JavaScript'teki dizeler, sayılar ve boolean'lar gibi ilkel veri türleri önceden tanımlanmış varlıklar olarak ortaya çıkarken nesneler farklı bir prensiple çalışır. {} (küme parantezleri) her kullandığımızda, yalnızca mevcut bir plana atıfta bulunmuyoruz; yepyeni bir nesneyi hayata geçiriyoruz. İki basit nesnenin oluşturulmasını düşünün:


 const cat = {}; const dog = {};


Burada cat ve dog ayrı nesnelerdir ve her birinin hafızada kendine ait bir alanı vardır. Bu prensip, diziler, tarihler ve işlevler de dahil olmak üzere JavaScript'teki tüm karmaşık veri yapılarını kapsayacak şekilde salt nesne değişmezlerinin ötesine uzanır.


Bu varlıkları oluşturmanın çeşitli yöntemleri olsa da nesneler için {} , diziler için [] ve tarihler için new Date() kullanmak, nesne örnekleri oluşturmaya yönelik en doğrudan yaklaşımlar arasındadır.


Peki artık ihtiyaç duyulmadığında bu nesnelere ne olacak? Süresiz olarak JavaScript evreninde mi kalacaklar? Cevap, JavaScript'in artık kullanılmayan belleği etkili bir şekilde temizleyen bir süreç olan çöp toplama mekanizmasında yatmaktadır.


Çöp toplama otomatik bir işlemdir; bu, kodunuzda onlara herhangi bir referans olmadığında nesnelerin imha edildiği ve tahsis edilen hafızanın geri kazanıldığı anlamına gelir.

JavaScript'te Değerleri Karşılaştırma: Görünüşün Ötesinde Eşitlik

JavaScript'te değerleri karşılaştırmak bazen aynı hedefe giden çeşitli yolların olduğu bir labirentte gezinmek gibi gelebilir: eşitliği anlamak. Değerleri karşılaştırmanın üç temel yolu vardır:


  1. Kesin Eşitlik ( === ): Bu eşitlik biçimi en kesin olanıdır; iki işlenenin hem değerini hem de türünü kontrol eder. Bu, "Bu iki değer hem tür hem de içerik açısından aynı mı?" sorusunu sormanın eşdeğeridir.


  2. Gevşek Eşitlik ( == ): Katı eşitlikten daha az katı olan gevşek eşitlik, karşılaştırma öncesinde tür zorlamasına izin verir. "Bu iki değerin türlerini gözden kaçırırsak aynı sayılabilir mi?" diye sormak gibi bir şey bu.


  3. Aynı Değer Eşitliği ( Object.is ): Bu yöntem katı eşitliğe benzer ancak özellikle özel JavaScript durumlarını ele alma şekli açısından birkaç kritik farklılığı vardır.


Object.is çalışırken görelim:


 console.log(Object.is(2, 2)); // true console.log(Object.is({}, {})); // false


Object.is({}, {}) neden false değerini döndürüyor? Her nesne değişmezi {} bellekte benzersiz bir nesne oluşturduğundan, Object.is bu nesneleri yapısal benzerliklerine rağmen farklı varlıklar olarak ele alır.

Katı Eşitliğin İnceliklerine Daha Derin Bir Bakış

Kesin eşitlik basit olsa da, özellikle belirli JavaScript değerlerinde kendine has özellikleri barındırır:


  • NaN === NaN : Şaşırtıcı bir şekilde, bu karşılaştırma false değerini döndürür. JavaScript'te, NaN (Sayı Değil) kendine eşit olmadığı kabul edilir; bu, tanımsız veya hatalı bir hesaplamanın sonucunu işaret etmeyi amaçlayan nadir bir özelliktir.


  • -0 ve 0 karşılaştırılması: -0 === 0 ve 0 === -0 , -0 ve 0 JavaScript'in sayı sisteminde farklı değerler olmasına rağmen true değerini döndürür. Bu eşitlik sıfır işaretini gözden kaçırıyor ve yalnızca büyüklüğüne odaklanıyor.

Pratik Uygulamalar

Eşitlik kontrolünde bu farklılıkları anlamak, hassas ve hatasız JavaScript kodu yazmak için çok önemlidir. === ve == rollerine sahip olsa da, Object.is ne zaman kullanılacağını bilmek, özellikle NaN , 0 ve -0 içeren uç durumlar için çok önemli olabilir.


Bu bilgi, geliştiricilerin eşitlik kontrolleri hakkında bilinçli kararlar almasına olanak tanır ve kodlarının çok çeşitli senaryolarda beklendiği gibi davranmasını sağlar.

JavaScript'te Nesne Özelliklerinde ve Referanslarda Gezinme

JavaScript'te nesne özelliklerini değiştirmek söz konusu olduğunda iki temel aracınız vardır: nokta gösterimi ve köşeli parantez gösterimi . Her iki yöntem de bir nesnenin içeriğine erişmek ve bunları değiştirmek için basit bir yol sunar. İşte hızlı bir başlangıç:


  • Nokta Gösterimi : Özelliklere nokta operatörü (örneğin, object.key ) aracılığıyla doğrudan erişin.


  • Parantez Gösterimi : Özellik adını belirtmek için parantez ve bir dize kullanın (örneğin, object['key'] ).


Bu teknikler nesnelerle etkileşimin temelini oluşturur. Ancak anlaşılması gereken kritik bir husus, JavaScript'in nesne referanslarını nasıl işlediğidir. İlkel veri türlerinin aksine, JavaScript'teki nesneler referanslı türlerdir ve bu, bir nesneyi değiştirdiğinizde, nesnenin doğrudan bir kopyasıyla değil, o nesnenin bellekteki konumuna bir referansla çalıştığınız anlamına gelir.

Gerçek Dünyadan Bir Örnek: Kodda İşbirlikçi Yazım

Bu kavramı hayata geçirmek için, iki hevesli yazar Emily ve Thomas'ın bir roman üzerinde işbirliği yaptığı bir senaryoyu ele alalım. Hikayelerinin karakterlerini ve ayarlarını yapılandırmak için JavaScript nesnelerini kullanmaya karar verirler:


 const project = { title: "Adventures in Code", characters: { protagonist: { name: "Alex", traits: ["brave", "curious"] } }, setting: { location: "Virtual World", era: "future" } };


Hikayelerini geliştirirken Emily, baş karakterden ilham alan ancak benzersiz bir değişime sahip bir yardımcı karakter tanıtıyor:


 const sidekick = project.characters.protagonist; sidekick.name = "Sam"; sidekick.traits.push("loyal");


Eş zamanlı olarak Thomas, romanlarının çerçevesini genişletmeye karar verir:


 const newSetting = project.setting; newSetting.location = "Cyber City"; newSetting.era = "2040";


İlk bakışta bu değişikliklerin orijinal project nesnesini nasıl etkilediğini merak edebilirsiniz. İşte sonuç:


  • Kahramanın adı artık "Sam" olarak görünüyor ve özellikleri arasında "sadakat" de yer alıyor. Bunun nedeni, sidekick yeni bir nesne değil, project.characters.protagonist bir referans olmasıdır. sidekick değiştirilmesi doğrudan orijinal project nesnesini etkiler.


  • Romanın geçtiği yer "2040" yılında "Siber Şehir"e dönüştü. Karakterlere benzer şekilde newSetting , project.setting bir referanstır; yani newSetting yapılan herhangi bir değişiklik, project.setting doğrudan etkiler.

Referansların Gücünü Anlamak

Bu örnek, JavaScript'teki çok önemli bir kavramın altını çizmektedir: nesnelerle çalışmak, referanslarla çalışmak anlamına gelir ve bir değişkene bir nesne atadığınızda, o nesneye bir referans atamış olursunuz.


Bu referans aracılığıyla yaptığınız herhangi bir değişiklik, o nesneye yapılan tüm referanslara yansıtılır. Bu davranış, karmaşık, birbirine bağlı veri yapılarına olanak sağlar ancak aynı zamanda istenmeyen yan etkilerden kaçınmak için dikkatli bir yönetim gerektirir.


Hikayemizde Emily ve Thomas'ın işbirlikçi süreci, nesne referanslarının kodlamada yaratıcı çabalara nasıl hizmet edebileceğini, karmaşık anlatıların veya daha pratik bir ifadeyle uygulamalarınızdaki karmaşık veri yapılarının ortak, dinamik gelişimine olanak sağladığını güzel bir şekilde gösteriyor.

JavaScript'te Nesne Kopyalamada Uzmanlaşmak: Sığ ve Derin Kopyalar

JavaScript'te nesnelerle çalışırken, doğrudan atama, referans kopyalamanın doğası gereği istenmeyen değişikliklere yol açabilir. Nesnenin bir kopyasını oluşturmak, orijinal nesneyi etkilemeden güvenli manipülasyona olanak tanır; bu şekilde kasıtsız değişiklikleri azaltacağız.


İhtiyaçlarınıza ve sahip olduğunuz senaryolara bağlı olarak sığ kopya ile derin kopya arasında seçim yapabilirsiniz.

Sığ Kopyalama Teknikleri:

  • Object.sign : Bu yöntem, özellikleri kaynaktan hedef nesneye ( {} ) kopyalayarak yeni bir nesne oluşturur. Object.assign yüzeysel bir kopyalama gerçekleştirdiğini unutmamak önemlidir; bu, iç içe geçmiş nesnelerin veya dizilerin değerlerine göre değil referansa göre kopyalandığı anlamına gelir.


     const original = { a: 1, b: { c: 2 } }; const copy = Object.assign({}, original); copy.bc = 3; // Affects both 'copy' and 'original'


  • Yayılma Operatörü ( ... ): Object.assign benzer şekilde, yayılma operatörü orijinal nesnenin özelliklerini yeni bir nesneye genişleterek yüzeysel bir kopya elde edilmesini sağlar.


     const copyUsingSpread = { ...original }; copyUsingSpread.bc = 4; // Also affects the 'original' object

Derin Kopyalama Yöntemleri:

  • JSON.parse ve JSON.stringify : Bu yaklaşım, nesneyi bir JSON dizesine serileştirir ve ardından onu tekrar yeni bir nesneye ayrıştırır. Etkili bir şekilde derin bir kopya oluşturur ancak işlevleri, Tarih nesnelerini, tanımsızları ve serileştirilemeyen diğer değerleri işleyemez.


     const deepCopy = JSON.parse(JSON.stringify(original)); deepCopy.bc = 5; // Does not affect the 'original' object


  • Kitaplıklar : Daha karmaşık senaryolar için, Lodash gibi kitaplıklar, çeşitli veri türlerini JSON yöntemlerinden daha etkili bir şekilde işlemek de dahil olmak üzere nesneleri derin klonlayabilen işlevler (örneğin, _.cloneDeep() ) sunar.

Pratik uygulama

İşbirliğine dayalı yazma projesi örneğimizi tekrar gözden geçirelim:


 const project = { title: "Adventures in Code", characters: { protagonist: { name: "Alex", traits: ["brave", "curious"] } }, setting: { location: "Virtual World", era: "future" } };


Orijinali etkilemeden projeyi değiştirmek için:

  • Derin Kopya için : Güvenli bir şekilde yeni bir karakter eklemek veya ayarı değiştirmek için JSON.parse(JSON.stringify(project)) öğesini kullanın.


  • Sığ Bir Kopya İçin : İç içe geçmiş yapıların sorun teşkil etmediği üst düzey değişiklikler için Object.assign veya spread operatörünü kullanın.


Sığ ve derin kopya arasında seçim yapmak, nesnenin karmaşıklığına ve manipülasyonunuzun özel gereksinimlerine bağlıdır. Sığ kopyalar daha hızlıdır ve basit nesneler için daha uygundur; derin kopyalar ise iç içe geçmiş yapılara sahip nesneler için gereklidir ve orijinal nesnenin dokunulmadan kalmasını sağlar.


Bu başa çıkma tekniklerini anlayıp uygulayarak, JavaScript'in referans tabanlı sisteminde güvenle gezinebilir ve veri manipülasyonlarınızın kesin ve kasıtlı olmasını sağlayabilirsiniz.

Prototipler: JavaScript'te Kalıtımın Gizli Konuları

Tıpkı bir romandaki karakterlerin özelliklerini atalarından miras alması gibi, JavaScript'teki nesneler de özelliklerini ve yöntemlerini prototiplerinden devralır. Bu konsept, Emily ve Thomas'ın "Kodda Maceralar" adlı romanlarında keşfettikleri hikaye anlatma becerisini yansıtıyor.


Prototiplere ilişkin anlayışımızı derinleştirmek için, JavaScript'teki miras modelini yansıtan yeni bir karakter dizisi sunarak hikayelerine devam edelim.


Romanlarının dünyasında, bilgeliği ve dillere olan hakimiyetiyle tanınan, "Antik Kodlayıcı" olarak bilinen efsanevi bir yazar vardır. Emily ve Thomas, yeni nesil kodlayıcıları temsil eden bu efsanevi figürden yola çıkarak yeni bir karakter olan "Coder Leo"yu oluşturmaya karar verirler.


 // The Ancient Coder, known for his profound wisdom const ancientCoder = { wisdom: 100 }; // Coder Leo, a young scribe in training const coderLeo = { __proto__: ancientCoder, age: 15 };


Bu anlatıda Coder Leo, "Prototip Zinciri" olarak bilinen büyülü bir miras yoluyla The Ancient Coder'a doğrudan bağlıdır. Bu bağlantı Leo'nun atasının bilgeliğinden faydalanmasına olanak tanır.


 console.log(coderLeo.wisdom); // 100


Prototip zinciri sayesinde Coder Leo, gençliğine rağmen The Ancient Coder'ın bilgeliğine erişebilir. Peki Antik Kodlayıcı'nın sahip olmadığı bir zorlukla veya özellikle karşılaştıklarında ne olacak?


 console.log(coderLeo.courage); // undefined


Bu durum, JavaScript'in prototip sisteminin temel prensibini göstermektedir: Nesnede bir özellik bulunamazsa, JavaScript onu bulmak için prototip zincirini arayacaktır. Özellik hala bulunamazsa, bu özelliğin yokluğunu belirten undefined değeri döndürülür.


Anlatımlarını ilerletmek için Emily ve Thomas, torunlara benzersiz özelliklerin nasıl eklenebileceğini ve onları atalarından nasıl ayırabileceklerini araştırıyorlar:


 // Introducing a unique trait to Coder Leo coderLeo.courage = 50; console.log(ancientCoder.courage); // undefined console.log(coderLeo.courage); // 50


Burada Coder Leo, The Ancient Coder'dan farklı bir cesaret özelliği geliştiriyor. Bu değişiklik The Ancient Coder'ın niteliklerini değiştirmez; JavaScript'in dinamik doğası sayesinde nesnelerin (veya karakterlerin) prototiplerinden (veya atalarından) bağımsız olarak nasıl gelişebileceğini gösterir.


Hikaye içindeki bu hikaye yalnızca Emily ve Thomas'ın romanını ilerletmekle kalmıyor, aynı zamanda JavaScript'in prototip tabanlı mirasına da ışık tutuyor. Bir romandaki karakterler gibi nesneler de özelliklerini atalarından miras alabilir. Ancak aynı zamanda kendi yollarını çizerek bireysel yolculuklarını yansıtan benzersiz özellikler geliştirme kapasitesine de sahiptirler.

Sihri Ortaya Çıkarmak: Prototiplerin ve Yerleşik Yöntemlerin Gücü

Emily ve Thomas, "Adventures in Code" adlı romanlarını derinlemesine araştırırken gizemli bir bölümle karşılaştılar: antik Protos Tome'u. Bu kitabın sadece bir olay örgüsü aracı olmadığını, aynı zamanda JavaScript'teki prototipleri ve yerleşik yöntemleri anlamaya yönelik bir metafor olduğunu keşfettiler; bu kavramlar, hikayelerinin dünyasına ve kodlama anlayışlarına bir sihir katmanı ekleyecekti.


Romanlarının kurgusal ortamı olan Scriptsville'de her karakter ve nesne, Tome of Protos'tan gelen yeteneklerle doludur. Bu büyülü kitap, nesnelerin özelliklerini ve yöntemlerini devraldığı JavaScript'teki prototipe benzer şekilde tüm bilgi ve becerilerin kaynağıdır.


 // A seemingly ordinary quill in Scriptsville const quill = {};


Emily, karakteri Ellie aracılığıyla bu tüy kalemi araştırıyor, ancak bunun sihirli bir bağlantı yoluyla Tome of Protos'a bağlı olduğunu buluyor; bu, onları prototiplerine bağlayan, JavaScript nesnelerindeki __proto__ özelliğine doğrudan bir benzetme.


 console.log(quill.__proto__); // Reveals the Tome's ancient scripts!


Bu açıklama, Ellie'nin hasOwnProperty ve toString çağırma yeteneği de dahil olmak üzere, Object prototipinden miras alınan JavaScript'in yerleşik yöntemlerini gösteren Tome'un bilgeliğine erişmesine olanak tanır.


Anlatı daha sonra Thomas'ın karakteri, büyülü çörekleriyle tanınan ünlü bir fırıncı olan Usta Donovan'ı tanıtıyor. Mutfak yeteneğini paylaşmaya çalışan Donovan, JavaScript'te yapıcı işlevi tanımlamaya benzer bir büyü yapar:


 function EnchantedDoughnut() { this.flavor = "magic"; } EnchantedDoughnut.prototype.eat = function() { console.log("Tastes like enchantment!"); };


Donovan'ın yarattığı her çörek, büyünün özünü taşıyor ve onları yiyen herkesin büyüyü deneyimlemesine olanak tanıyor. Hikayenin bu kısmı, tıpkı Donovan'ın donutlarının yenilme yeteneğini miras alması gibi, JavaScript'te bir yapıcı işleviyle oluşturulan nesnelerin, yapıcılarının prototipinden yöntemleri nasıl miras aldığını gösteriyor.


Scriptsville geliştikçe büyüsü de gelişiyor ve eski büyülerden modern sınıf sözdizimi sanatına geçiş yapıyor. Emily ve Thomas, Donovan'ın zanaatını yeni söz dizimi ile yeniden tasarlayarak onun büyüsünü daha erişilebilir hale getiriyor ve JavaScript'teki çağdaş uygulamalarla uyumlu hale getiriyor:


 class ModernEnchantedDoughnut { constructor() { this.flavor = "modern magic"; } eat() { console.log("Tastes like modern enchantment!"); } }


Bu geçiş yalnızca Donovan'ın pişirme sanatını güncellemekle kalmıyor, aynı zamanda JavaScript'in evrimini de yansıtıyor; temeldeki prototip tabanlı mirası korurken sınıf sözdiziminin zarafetini ve verimliliğini vurguluyor.

Emily ve Thomas'tan Ne Öğrendik?

Emily ve Thomas'ın "Adventures in Code"un yaratılışındaki yolculuğu, prototipleri, yerleşik yöntemleri ve bizzat JavaScript'in evrimini anlamak için büyüleyici bir alegoriye dönüşüyor.


Karakterleri ve hikayeleri aracılığıyla, karmaşık kavramları ilgi çekici ve derin bir şekilde aydınlatıyorlar; her nesnenin ve karakterin, tıpkı her JavaScript nesnesi gibi, daha büyük, birbirine bağlı bir miras ve yenilik dokusunun parçası olduğunu gösteriyorlar.


Hikayeleri hem hikaye anlatımında hem de programlamada temel bir gerçeğin altını çiziyor: geçmişi anlamak, şimdiki zamana hakim olmak ve geleceğe yönelik yenilik yapmak için çok önemlidir.


Scriptsville'in büyülü dünyası, antik ciltleri, büyülü çörekleri ve modern büyüsüyle, JavaScript'in prototip sisteminin derinliklerini ve mirasın gücünü keşfetmek için canlı bir arka plan görevi görüyor.

Scriptsville'in Büyülü Yardımcı Programları: Nesneleri Büyülemek ve Uyum Sağlamak

Emily ve Thomas, Adventures in Code adlı romanlarında daha derinlere indikçe karakterler, ortamlar ve sihirli öğelerle dolu karmaşık dünyayı yönetmenin bir yolunun gerekliliğini keşfettiler.


Nesneleri büyüleme ve ülke genelinde uyumu sağlama konusundaki uzmanlığıyla tanınan, Scriptsville'li bilge bir yazar olan Ellie'ye başvurdular.

Yolların Büyüsü: İç İçe Gerçekliklerin Sağlanması

Ellie onlarla, kendi dünyalarında iç içe geçmiş alanların varlığını garanti altına alabilecek, ensureObjectPath sihirli bir formülü paylaştı:


 function ensureObjectPath({obj, path}) { path.split('.').reduce((acc, part) => { if (!acc[part]) acc[part] = {}; return acc[part]; }, obj); return obj; } // Ensuring the path to a hidden forest in their novel const world = {}; ensureObjectPath({obj: world, path: 'hidden.forest.clearing'}); console.log(world); // Outputs: { hidden: { forest: { clearing: {} } } }


Ellie, bu büyünün onlara roman evreninde herhangi bir yer yaratma olanağı sağladığını, böylece her karakterin var olmayan diyarlara girme korkusu olmadan görevlerine başlayabilmesini sağladığını açıkladı.

Gerekli Öğeler Parşömeni: Karakterlerin Temellerini Sağlama

Ayrıca Ellie onlara, her karakterin yolculukları için gerekli temel niteliklere sahip olmasını sağlamak için tasarlanan checkForRequiredKeys başka bir büyüyü tanıttı:


 const REQUIRED_KEYS = ['age', 'address', 'gender']; function checkForRequiredKeys(obj) { REQUIRED_KEYS.forEach(key => { if (!Object.hasOwn(obj, key)) { obj[key] = {}; } }); } // Ensuring every character has the essential attributes const character = { name: "Ellie" }; checkForRequiredKeys(character); console.log(character); // Outputs: { name: "Ellie", age: {}, address: {}, gender: {} }


Bu büyü, Emily ve Thomas'ın karakterlerine karmaşıklık katmalarına olanak tanıdı ve anlatıları ne kadar karmaşık olursa olsun hiçbir ayrıntının gözden kaçırılmamasını sağladı.

Scriptsville'in Yankıları: Büyüden Aydınlanmaya

Hikayeleri ilerledikçe, Ellie'nin paylaştığı büyüler yalnızca "Kodda Maceralar"ı zenginleştirmekle kalmadı, aynı zamanda JavaScript'teki nesne manipülasyonu ve yapısının temel ilkelerini de aydınlattı.


Tıpkı ensureObjectPath büyüsünün iç içe geçmiş gerçekliklerin yaratılmasına izin vermesi gibi, JavaScript geliştiricileri de uygulamaları içindeki verileri yapılandırmak için benzer bir güce sahiptir.


Benzer şekilde checkForRequiredKeys büyüsü, veri bütünlüğünü sağlamak için gerekli olan savunma amaçlı programlama uygulamalarını yansıtır.

Çözüm

Scriptsville'in büyülü diyarlarında gezinirken Emily, Thomas, Ellie ve bir dizi sihirli varlık bize yoldaş oldular ve JavaScript'in sırlarını bu diyarın kendisi kadar büyüleyici bir şekilde ortaya çıkardılar.


Macera ve keşif hikayeleri aracılığıyla, en basit sözdiziminden yüzeyinin altında çalışan karmaşık motorlara kadar JavaScript'in kalbinin derinliklerine indik.


Hikaye anlatımının büyüsünün programlama mantığıyla birleştiği, JavaScript evreninin katmanlı harikalarını ortaya çıkardığı, eşi benzeri olmayan bir yolculuktu.


  • İlkel ve Nesne Türleri : JavaScript'in ilkel ve nesne türlerini birbirinden ayırarak başladık ve bu yapı taşlarının dilin temelini nasıl oluşturduğunu ortaya çıkardık. Karakterlerimizin keşifleri sayesinde ilkellerin değişmez doğasını ve nesnelerin dinamik, referansa dayalı doğasını anladık.


  • Nesneleri Oluşturma ve Karşılaştırma : JavaScript'te nesne oluşturmayı, değerleri karşılaştırmayı ve eşitlik nüanslarını öğrendik. Scriptsville'deki büyülü eserler ve büyüler, katı eşitliğin ( === ), gevşek eşitliğin ( == ) ve incelikli karşılaştırmalar için Object.is kullanımının anlaşılmasının önemini aydınlattı.


  • Nesne Özellikleri ve Prototipler : Nesne özelliklerini derinlemesine inceleyerek, özelliklere erişim ve bunları değiştirmek için nokta ve köşeli parantez gösteriminin gücünü ve prototiplerin nesne kalıtımındaki önemli rolünü keşfettik.


    Scriptsville'deki miras kabloları ve büyülü parşömenlerle ilgili hikayeler, nesnelerin özellikleri nasıl miras aldığını ve geçersiz kıldığını göstererek prototip zincirini hayata geçirdi.


  • Nesneler için Yardımcı Fonksiyonlar : Son olarak, nesne yapılarını değiştiren ve veri bütünlüğünü sağlayan fayda fonksiyonlarını araştırdık. Ellie'nin paylaştığı, ensureObjectPath ve checkForRequiredKeys gibi sihirli formüller, iç içe geçmiş nesnelerle çalışmaya ve temel özelliklerin varlığını sağlamaya yönelik pratik teknikleri gösterdi.


Scriptsville'in anlatımının merceğinden bakarak, JavaScript'in özelliklerinin nasıl hem sihirli hem de mantıklı olabileceğini, geliştiricilere yaratıcılık ve problem çözme için geniş bir oyun alanı sunabileceğini gördük.


Scriptsville'in büyüleyici hikayeleri masallardan çok daha fazlasıdır; bunlar programlama sanatının metaforlarıdır ve dijital dünyalarımızı ustalıkla oluşturmak için JavaScript'in temel ilkelerini anlamanın önemini vurgularlar.


Bu yolculuğa kitabımızı kapatırken maceranın burada bitmediğini unutmayın. Araştırdığımız her kavram, JavaScript'i daha derinlemesine anlamak ve ustalaşmak için bir basamaktır.


Emily ve Thomas'ın "Kodda Maceralar" masallarını dokudukları gibi, siz de anlatılarınızı, büyülü nesnelerinizi ve büyülü alemlerinizi programlamanın sınırsız evreninde oluşturabilirsiniz.