JavaScript 📜
October 11

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;

davron.greet(); // "Hello!"

Prototype objectlarga bog'lash yo'llari;

1) __proto__ xususiyati orqali

masalan: davron.__proto__ = user;

2) Object.setPrototypeOf() metodi orqali:

masalan: Object.setPrototypeOf(davron, user);

3) Object.create() metodi orqali

const davron = Object.create(user);

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.

  • toString()
  • hasOwnProperty()
  • valueOf()
  • va hokazo.

Object.create(obj) yangi obyekt yaratadi, qaysiki prototipi obj bo'lgan:

const admin = Object.create(baseUser);

Shunda prototype chain quyidagi ko'rinishda bo'ladi:

admin → baseUser → Object.prototype → null

Misol:

const baseUser = { greet() { console.log("Hello"); } };

const admin = Object.create(baseUser); admin.role = 'admin';

Quyidagi true qaytaradi:

Object.getPrototypeOf(admin) === baseUser

admin.greet();

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"); }

const bmw = new Car('BMW');

console.log(bmw);

console.log(Object.getPrototypeOf(bmw) === Car.prototype); bmw.drive();

Quyidagi konstruktor funksiyadir:

function Car(brand) { this.brand = brand; }

Biz new kalit so'zidan foydalanib obyekt yaratganimizda quyidagi voqealar yuz beradi.

  • bo'sh obyekt yaratiladi { }
  • obyektning prototipi avtomatik ravishda Car.prototype ga bog'lanadi.
  • this.brand = brand yaratilgan obyektda brand xususiyatini yaratadi
  • avtomatik ravishda yangi obyekt yaratiladi

Prototype method

Car.prototype.drive = function() { ... }

Bu meros qolish yordamida Car konstruktor funksiyasidan yaratilgan har bir obyektlarga yangi metod qo'shadi

Instance yaratish

const bmw = new Car("BMW");

Metodni tekshirish:

bmw.drive();

Outputs

BMW is driving

Prototype ni tekshirish

console.log(Object.getPrototypeof(bmw) === Car.prototype); // true