Prototypes in JS
Prototype - bu maxsus mexanizm bo'lib uning yordamida obyektlar bir-biridan xususiyatlarni meros qilib olishi mumkin
Javascriptda har bir obyekt yashirin xususiyat (property)ga ega. U [[Prototype]] deb ataladi. (__proto__ orqali kirish mumkin)
const person = {
greet() {
console.log("Hello!");
}
};
const davron = {
name: "Davron"
};
// davron'ning prototype'ni person'ga bog'lash
davron.__proto__ = person;
Prototype objectlarga bog'lash yo'llari;
1) __proto__ xususiyati orqali
2) Object.setPrototypeOf() metodi orqali:
3) Object.create() metodi orqali
Agar biz Object literal sintaksisi, ya'ni { } yordamida obyekt yaratadigan bo'lsak Javascript uni avtomatik ravishda Object.prototype bilan bog'laydi.
Shuning uchun Object.getPrototypeOf(obj) metodi built-in prototype object 'ni qaytaradi. U quyidagi default holatdagi metodlarga ega bo'ladi.
Object.create(obj) yangi obyekt yaratadi, qaysiki prototipi obj bo'lgan:
Shunda prototype chain quyidagi ko'rinishda bo'ladi:
const baseUser = {
greet() {
console.log("Hello");
}
};
const admin = Object.create(baseUser);
admin.role = 'admin';
Biz admin.greet() deb chaqirganimizda:
- javascript dastlab admin obyekti ichidan greet() metodini qidiradi va undan topa olmaydi
- keyin u prototype chaindan admin obyektining prototipi bo'lgan baseUser obyekti ichidan shu metodni qidiradi
- greet() metodi baseUser obyekti ichidan topiladi va console ga chiqadi
Constructor Functions & Prototypes
function Car(brand) {
this.brand = brand;
}
Car.prototype.drive = function() {
console.log(this.brand + " is driving");
}
console.log(Object.getPrototypeOf(bmw) === Car.prototype);
bmw.drive();
Biz new kalit so'zidan foydalanib obyekt yaratganimizda quyidagi voqealar yuz beradi.
- bo'sh obyekt yaratiladi { }
- obyektning prototipi avtomatik ravishda
Car.prototypega bog'lanadi. this.brand = brandyaratilgan obyektda brand xususiyatini yaratadi- avtomatik ravishda yangi obyekt yaratiladi
Bu meros qolish yordamida Car konstruktor funksiyasidan yaratilgan har bir obyektlarga yangi metod qo'shadi
console.log(Object.getPrototypeof(bmw) === Car.prototype); // true