Javascript’te Nesne Oluşturma Yöntemleri Nelerdir?
JavaScript’te nesne yapısı, tabiri caizse dilin belkemiği özelliklerinden biridir. Bu nedenle, nesne oluşturma yöntemleri hakkında bilgi sahibi olmak elzem bir hale gelmiştir. Bu yazımızda, JavaScript’te nesne oluşturma yöntemleri hakkında detaylı bir yazı yazacağız.
Javascript’te Nesne (Object) Kavramı
JavaScript, prototip (prototype) tabanlı bir dildir. Yani bu demektir ki, JavaScript’teki her bir nesnenin prototip nesnesi olduğu anlamına gelir. Tabiri caizse prototip nesnesi, nesnelere metodlar (method) ve özellikler (property) sağlayan bir şablon nesnesi görevi görür.
Konunun ayrıca Mozilla‘daki tanımını da paylaşmak isterim; “Prototipler, JavaScript nesnelerinin birbirlerinden özellik miras almasını sağlayan mekanizmadır.”
Her JavaScript nesnesi bir prototip nesnesine sahipolduğundan bu prototip nesnesinden, nesneye metodlar ve özellikler sağlanır. Ayrıca bu prototip nesnesi de bir başka prototip nesnesine sahip olabilir ve bu şekilde zincirleme bir prototip yapısını oluşturulabilir. Zaten bu yapıya literatürde prototip zinciri (prototype chain) denilmektedir.
Bir JavaScript nesnesinin özellikleri veya metodları, o nesnenin prototip zincirindeki diğer nesneler tarafından tanımlanmış olabilir. Zaten bu durum da, bir nesnenin özelliklerinin veya metodlarının, onun prototip zincirindeki diğer nesneler tarafından tanımlanmış olması sayesinde mümkündür.
Örneğin, bir JavaScript dizisi (array), Array nesnesinin prototipinden türetilir ve bu nedenle halihazırda kullandığımız birçok özellik ve metoda sahiptir. Bu özellikler ve metodlar, Array nesnesinin prototip zincirindeki diğer nesneler tarafından tanımlanmıştır.
İşte bu prototip zinciri yapısı, JavaScript’teki nesne tabanlı programlamanın temelini oluşturur ve nesnelerin özellikleri ve metodlarına erişimi kolaylaştırır.
Malumunuz nesneler, anahtar-değer (key-value) çiftleri şeklinde yapılandırılır ve her bir anahtar bir özelliği, her bir değer ise bu özelliklerin değerini temsil eder. Örneğin, bir arabanın nesnesi şu şekilde olabilir:
// nesne
let car = {
model: 'Tesla',
"year": 2022,
'color': 'red',
isElectric: true,
"is beautiful": false,
start: function() {
console.log('The car is starting');
}
};
Yukarıdaki örneğimizde, car
adlı nesne, model
, "year"
, 'color'
, isElectric
, "is beautiful"
ve start
özelliklerini içerir. start
özelliği ise bir metottur ve console.log()
aracılığıyla bir çıktı yazdırır.
❗ Örneğimizde özelliklerin tek tırnak, çift tırnak veya tırnaksız yazıldığını görmüşsünüzdür. Alternatif bir şekilde yazılabildiğini göstermek adına bu şekilde bir gösterim sunduk. Ancak arada boşluk olan anahtar adları muhakkak tek veya çift tırnak içinde yazılmalıdır.
❗ Nesnelerin önemli bir özelliği de özelliklerine nokta (dot notation) veya köşeli parantezler (bracket notation) aracılığıyla erişebilme yeteneğidir. Örneğin:
// Dot notation
console.log(car.model); // Tesla
// Bracket notation
console.log(car['model']); // Tesla
❗ Ancak rakam, boşluk veya özel karakterler içeren anahtarlara erişirken muhakkak bracket notation kullanmalıyız. Aksi takdirde kodumuz hata verir.
// Dot notation
console.log(car.model); // Tesla
console.log(car.isElectric); // true
car.start(); // The car is starting
console.log(car.'is Beautiful'); // SyntaxError
// Bracket notation
console.log(car['year']); // 2022
console.log(car['is beautiful']); // false
car['start'](); // The car is starting
Görüldüğü gibi, dot notation ile erişilebilen özelliklere bracket notation da erişebiliriz. Ancak özellik ismi içerisinde boşluk veya özel karakterler varsa sadece bracket notation kullanılabilir.
❗ ES6 ile birlikte, JavaScript’te obje oluştururken, “property value shorthand (property değerlerini kısaltma)” yöntemi kullanılabilir hale gelmiştir. Bu özellik, özellikle bir fonksiyonun parametrelerini bir nesneye aktarırken kullanışlıdır ve kodunuzu daha sade ve okunabilir yapar.
// Normal
const name = 'John';
const surname = 'Doe';
const person = {name: name, surname: surname};
console.log(person); // {name: "John", surname: "Doe"}
// Property short hand
const name = 'John';
const surname = 'Doe';
const person = {name, surname};
console.log(person); // {name: "John", surname: "Doe"}
Gördüğünüz gibi, property value shorthand yöntemi ile bir nesne oluştururken, eğer property adları ve bu property’lerin değerleri aynı değişken ismine sahipse, bu değişken adını yalnızca bir kez yazmamız yetmektedir.
Javascript’te Nesne Oluşturma Yöntemleri
Genel hatlarıyla JavaScript’teki nesne oluşturma yöntemlerini öğrendiğimze göre, sıra geldi hangi yöntemler kullanarak nesne oluşturabiliriz sorusunu yanıtlamaya.
Nesne Literalleri ile Nesne Oluşturma
⭐ Nesne Literalleri: Nesne oluşturmanın en temel ve yaygın yöntemlerinden biridir. Süslü parantezler {}
içerisinde belirtilen anahtar-değer çiftleri ile bir nesne oluşturulur. Örneğin:
//
let car = {
brand: 'Honda',
model: 'Civic',
year: 2022,
drive: function() {
console.log('The car is driving');
}
};
Object () ile Nesne Oluşturma
⭐ Object() Constructor: Object() constructor’u, içine parametre almadığımızda boş bir nesne oluşturur. Eğer içine bir parametre gönderirsek, gönderdiğimiz değeri içeren bir nesne oluşturur. Örneğin:
// JavaScript Nesne Oluşturma Yöntemleri
let emptyObject = new Object();
let person = new Object({ name: 'John', age: 30 });
Constructor Fonksiyonlarıyla Nesne Oluşturma
⭐ Constructor Functions: Bir constructor functions (yapıcı fonksiyon) ile nesne oluşturmak, özellikle bir nesne örneği oluştururken aynı türdeki özelliklere sahip birden fazla nesne oluşturmamız gerektiğinde faydalıdır. Constructor fonksiyonu, her özellik ve metodu ayrı ayrı belirtilen bir sınıf veya şablon görevi görür. Örneğin:
// JavaScript Nesne Oluşturma Yöntemleri
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function() {
console.log('Hello!');
}
}
let person1 = new Person('John', 30);
let person2 = new Person('Jane', 25);
Class Anahtar Kelimesiyle Nesne Oluşturma
⭐ Class: ECMAScript 2015 (ES6) ile birlikte JavaScript’e, OOP destekli programlama dillerinden aşina olacağınız class (sınıf) tanımlama özelliği eklenmiştir. Sınıflar, constructor fonksiyonlarına benzer şekilde özellikler ve metodlar içerir.
Ancak, belirtmek gerekir ki sınıflar dile eklenmiş yeni bir özellik olmayıp “syntactic sugar” (sentaks şekeri) olup altta yatan mekanizma yine constructor fonksiyonlarıdır. Örneğin:
// JavaScript Nesne Oluşturma Yöntemleri
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log('Hello!');
}
}
let person1 = new Person('John', 30);
let person2 = new Person('Jane', 25);
Factory Fonksiyonlarıyla Nesne Oluşturma
⭐ Factory Functions: Bir factory fonksiyonu, bir nesne örneği döndüren bir fonksiyondur. Bu yöntemle birden fazla nesne örneği oluşturmak kolaydır. Örneğin:
// JavaScript Nesne Oluşturma Yöntemleri
function createPerson(name, age) {
return {
name: name,
age: age,
sayHello: function() {
console.log('Hello!');
}
}
}
let person1 = createPerson('John', 30);
let person2 = createPerson('Jane', 25);
Prototype Anahtar Kelimesiyle Nesne Oluşturma
⭐ Prototype Yöntemi: Javascript’te her bir nesne prototip referansına sahiptir. Böylece bir nesnenin sahip olmadığı özellikler bir prototip nesnesinden miras alınabilecektir. Örneğin:
// JavaScript Nesne Oluşturma Yöntemleri
function Person(name) {
this.name = name;
}
Person.prototype.eat = function() {
console.log("eating");
}
Person.prototype.age = 30;
const person1 = new Person("John");
console.log(person1.age); // 30
person1.eat(); // eating