Bu 10 sual vasitəsilə JavaScript-in prototype zənciri, __proto__, prototype, Object.create(), constructor funksiyalar və new-in daxili iş prinsipi ətraflı şəkildə izah olundu. Bu biliklər JavaScript-i daha dərin anlamaq və daha güclü tətbiqlər yazmaq üçün vacibdir.
1. Prototype zənciri nədir?
Spoiler
Cavab: Prototype zənciri — JavaScript obyektlərinin digər obyektlərdən metod və propertiləri irsi olaraq almasına imkan verən mexanizmdir. JavaScript-də hər obyektin __proto__ adlı gizli bir xassəsi olur və bu xassə həmin obyektin hansı digər obyektdən miras aldığını göstərir. Axtarılan property obyektin özündə yoxdursa, JavaScript həmin property-ni zəncir üzrə yuxarıdakı prototiplərdə axtarır.
2. __proto__ və prototype arasında fərq nədir?
Spoiler
Cavab:
__proto__ — istənilən obyektin daxili [[Prototype]] (gizli irsi əlaqəsi) istinadıdır.
prototype — yalnız constructor funksiyalara (məsələn, function A() {}) aid olan xassədir və new ilə yaradılmış obyektlərin __proto__su bu prototype-ə istinad edir.
Sadə desək:
const obj = new Constructor();
obj.__proto__ === Constructor.prototype // true
3. Aşağıdakı kodun nəticəsi nə olacaq? İzah edin.
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
return "Hello, " + this.name;
};
const p1 = new Person("John");
console.log(p1.greet()); // ?
console.log(p1.__proto__ === Person.prototype); // ?
Spoiler
Cavab:
p1.greet() → "Hello, John" — çünki greet metodu Person.prototype-dədir.
p1.__proto__ === Person.prototype → true — çünki new ilə yaradılmış obyektlərin __proto__su həmin constructor-un prototype-inə bərabər olur.
4. JavaScript-də __proto__ necə işləyir?
Spoiler
Cavab: JavaScript obyekt üzərində bir property tapmayanda, avtomatik olaraq __proto__ vasitəsilə onun prototipinə baxır. Bu proses zəncirvari davam edir — yuxarı prototiplərə baxılır — ta ki null-a çatana qədər (Object.prototype.__proto__ === null).
5. Bu kod niyə işləmir?
const obj = {
name: "Elvin",
sayHi: function() {
return "Hi " + this.name;
}
};
obj.prototype = function sayHi() {
return "Hello " + this.name;
};
obj.sayHi();
Spoiler
Cavab: Burada səhv odur ki, obj adi obyekt olduğu üçün onun prototype property-si işləmir. prototype yalnız constructor funksiyalar üçün işləyir. Bu şəkildə olmalı idi:
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
return "Hello " + this.name;
};
6. Aşağıdakı kodun nəticəsi nə olacaq? Niyə?
const animal = {
eats: true
};
const rabbit = Object.create(animal);
rabbit.jumps = true;
console.log(rabbit.eats); // ?
console.log(rabbit.jumps); // ?
console.log(animal.jumps); // ?
Spoiler
Cavab:
rabbit.eats → true — irsi olaraq animal-dan gəlir
rabbit.jumps → true — öz property-dir
animal.jumps → undefined — çünki jumps yalnız rabbit-ə aiddir
7. Object.create() nədir və onu new əvəzinə nə vaxt istifadə edərik?
Spoiler
Cavab:
Object.create(proto) — yeni bir obyekt yaradır və onun __proto__-sunu verdiyimiz proto obyektinə bağlayır.
new ilə müqayisədə Object.create() bizə birbaşa prototipi təyin etməyə imkan verir. Əgər constructor funksiyadan istifadə etmiriksə, sadə obyekt irsiliyi üçün Object.create() daha uyğundur.
8. Bu kodun nəticəsi nədir? Niyə?
function A() {}
A.prototype = {
sayHello: function() {
return 'Hello from A';
}
};
const obj = new A();
A.prototype = {
sayHello: function() {
return 'Hello from modified A';
}
};
console.log(obj.sayHello());
Spoiler
Cavab: obj.sayHello() → "Hello from A"
Çünki obj yaradıldıqdan sonra A.prototype dəyişdirilsə də, obj artıq köhnə prototipi saxlayır. Yeni prototype ancaq sonrakı instansiyalara təsir edərdi.
9. new əməliyyatını özümüz necə implement edə bilərik?
Spoiler
Cavab:
function myNew(Constructor, ...args) {
const obj = {};
Object.setPrototypeOf(obj, Constructor.prototype);
const result = Constructor.apply(obj, args);
return typeof result === 'object' && result !== null ? result : obj;
}
Bu funksiyamız:
Boş obyekt yaradır
Onun __proto__sunu constructor-un prototype-inə bağlayır
Constructor-u həmin obyektə this kimi tətbiq edir
Əgər constructor obyekt qaytarmırsa, yeni obyekt qaytarılır
10. Bu kodun nəticəsi nə olacaq? Niyə dəyişir?
const grandParent = {
greet: function() {
return "Hello from GrandParent";
}
};
const parent = Object.create(grandParent);
const child = Object.create(parent);
parent.greet = function() {
return "Hello from Parent";
};
console.log(child.greet());
delete parent.greet;
console.log(child.greet());
Spoiler
Cavab:
Birinci console.log → "Hello from Parent" — çünki child.greet() zəncirdə parent-da tapılır
İkinci console.log → "Hello from GrandParent" — çünki parent.greet silinib və JavaScript irsi olaraq grandParent-a baxır