25 август 2025

Prototip usullari, objects without **proto**

Ushbu bo’limning birinchi bobida biz prototipni o’rnatish uchun zamonaviy usullar mavjudligini eslatib o’tdik.

__proto__ biroz eskirgan hisoblanadi (JavaScript standartining faqat brauzer qismida).

Zamonaviy usullar:

Ular __proto__ o’rniga ishlatilishi kerak.

Masalan:

let animal = {
  eats: true
};

// prototip sifatida animal bilan yangi obyekt yaratish
let rabbit = Object.create(animal);

alert(rabbit.eats); // true

alert(Object.getPrototypeOf(rabbit) === animal); // rabbit-ni prototipini olish

Object.setPrototypeOf(rabbit, {}); // rabbit prototipini {} ga o'zgartirish

Object.create ixtiyoriy ikkinchi argumentga ega: xususiyat tavsiflovchilari. U yerda yangi obyektga qo’shimcha xususiyatlarni taqdim etishimiz mumkin, masalan:

let animal = {
  eats: true,
};

let rabbit = Object.create(animal, {
  jumps: {
    value: true,
  },
});

alert(rabbit.jumps); // true

Deskriptorlar Xususiyat bayroqlari va tavsiflovchilar bobida tasvirlanganidek bir xil formatda bo’ladi.

Obyektni klonlashni for..in da nusxalash xususiyatlaridan ko’ra kuchliroq bajarish uchun Object.create dan foydalanishimiz mumkin:

// obj ning to'liq bir xil sayoz kloni
let clone = Object.create(
  Object.getPrototypeOf(obj),
  Object.getOwnPropertyDescriptors(obj)
);

Ushbu chaqiruv obj ning barcha nusxalarini, shu jumladan, barcha xususiyatlarni: ro’yxatga olinadigan va sanab bo’lmaydigan ma’lumotlarni, ma’lumotlar xususiyatlarini va getter/setter-larni – hamma narsani va [[Prototype]] huquqini oladi.

Qisqa tarix

Agar biz [[Prototype]] ni boshqarishning barcha usullarini hisoblasak, juda ko’p narsa bor! Buni bajarishning ko’plab usullari mavjud!

Nega shunday?

Bu tarixiy sabablarga ko’ra.

  • Konstruktor funktsiyasining "prototype" xususiyati juda qadim zamonlardan beri ishlaydi.
  • Keyinchalik 2012 yilda: Object.create standartda paydo bo’ldi. Bu berilgan prototip bilan obyekt yaratishga imkon berdi, lekin uni olishga/o’rnatishga imkon bermadi. Shunday qilib brauzerlar istalgan vaqtda prototipni olish/o’rnatishga imkon beradigan nostandart __proto__ kiruvchini qo’lladilar.
  • Keyinchalik 2015 yilda: Object.setPrototypeOf va Object.getPrototypeOf standartga qo’shildi. __proto__ hamma joyda amalga oshirildi, shuning uchun brauzerdan tashqari muhit uchun ixtiyoriy bo’lgan standartning B ilovasiga yo’l oldi.

Hozirda bizda bu usullarning barchasi bizning ixtiyorimizda.

Nima uchun