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:
- Object.create(proto[, descriptors]) –
proto[[Prototype]]va ixtiyoriy xususiyat tavsiflovchilari sifatida bo’sh obyektni yaratadi. - Object.getPrototypeOf(obj) –
objning[[Prototype]]ni qaytaradi. - Object.setPrototypeOf(obj, proto) –
objning[[Prototype]]niprotoga o’rnatadi.
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.createstandartda 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.setPrototypeOfvaObject.getPrototypeOfstandartga 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