Object Descriptors va flags
specially edited for @JoshDeveloper

Assalomu alaykum bugungi maqolamizda biz javascript objectlariga chuqurroq nazar tashlaymiz.Bismillah.
Object property bu faqat 'key: value' lardan iborat emas. Object property judaham kuchli va moslashuvchanlikka boy. Biz aynan shu maqolamizda objectning qo'shimcha 3 ta attributlari bilan qo'ldan kelgancha tanishib o'tamiz.
Property flags
Objectda uchta attributlar mavjud ularni biz "flags" deb ataymiz.
1. Writable, agar "writable:true" holatida bo'lsa object ichidagi propertysini o'zgartirib bo'ladigan yoki "writable:false" holatida propertyni o'zgartirib bo'lmaydigan holatga keltirish mumkin.
2. Enumerable, "enumerable:true" ko'rinishida object ichidagi propertyni object valuelar listda ko'rsa boladi, "enumreable: false" bu holatda ma'lum bir tanlangan propertyni, object ichidagi valuelarni listida yo'q boladi.
3.Configurable,true holatida ma'lum bir tanlangan propertyni o'chirish, modefikatsiya qilish imkonini beradi.false holatida esa aksincha bo'ladi.
Property Descriptors
Biz bu takrorlab o'tgan object flaglarni to'g'ridan to'g'ri ko'ra olmaymiz ularni ko'rish uchun ma'lum bir methodni qo'llashimiz kerak bu: Object.getOwnPropertyDescriptor().Keling endi bu methodni ishlatish yo'lini ko'rib chiqsak.

Qavs ichidagi "obj" degan joyiga object nomi yoziladi, "property_name"ga esa tanlangan object ichidagi property nomi yoziladi.
Ko'nikmamizni kuchaytirish maqsadida bir muncha misollarga toxtalib o'tsak.

Bu yerda biz 'obj' nomli object ichidagi 'name' deb nomlanuvchi propertyni descriptorlarini ko'rdik. Javob tariqasida kelayotgan object ichida value bandini ko'rishimiz mumkun, unda aynan biz kiritgan propertyning 'John' ismi mavjud.Object ichidagi barcha flaglar dastlab true holatida bo'ladi. Savol !!! Ularni qanday o'zgartirsa bo'ladi.
Albatta Object.defineProperty() orqali

Tepadagi kodda ko'rishimz mumkun "obj_name" bu object nomi uchun, "property_name" object property nomini kiritish uchun, "descriptor" degan bandiga descriptorlarga {} orqali o'zgartirish kiritiladi.

Dastlab biz bo'sh object yaratib oldik va uni Object.defineProperty() ga solib u yerda 'name' nomli poperty yaratdik va unga descriptor yozdik {value:"John",writable:true} va keyin Object.getOwnPropertyDescriptor() orqali name propertyni descriptorlarini console ga chiqardik. ko'rishingiz mumkun {value:'John',writable:true},ammo qolgan flaglar avtomatik ravishda false bo'lib qolgan.Xatto writable flagni ham Objec.defineProperty() ni descriptorlar bandiga yozmaganimizda u ham avtomatik false bo'lar edi.Keling endi object flaglari bilan yanada yaqindan tanishib chiqsak.
Writable
Qisqacha tanishib o'tkanimizdek "writable:false" propertyga o'zgartirish kiritishni bloklaydi.Misol uchun:

Bu kodda biz Object.defineProperty() da "writable:false" qilgandan so'ng obj.namega hech qanday o'zgarish kiritolmaymiz.
Enumerable
'enumerable:false' propertyni for in loop ishlatganimizda yoki Object.values() ni ishlatganimizda shu propertyni listda ko'rsatmaydi.

Ko'rishimiz mumkun obj da hello() funksiyasi mavjud unga "enumerable:false" kiritish natijasida, Object.values(obj) deyilganida faqat array ichida "John" qaytadi.
Configurable
Ma'lum bir property configurable false talqinida bo'lsa aynan o'sha propertyni delete qilib bo'lmaydi...

Objectda name nomli property mavjud uni Object.definePoperty() orqali "configurable:false" qilinganda pastgi qisimda yozilgan "delete obj.name" ni hech qanday ta'siri bo'lmaydi.
Object.defineProperties() Object.getOwnPropertyDescriptors()
Object.defineProperties() object ichidagi barcha propertylarga birdaniga descriptorlarini yozish imkonini beradi.Misol uchun.

Object.getOwnPropertyDescriptors() bunda faqatgina object nomi kiritiladi va butun boshli object ichidagi propertylarni descriptorlar haqidagi ma'lumotlari to'liq kelib chiqadi.
E'tiboringiz uchun rahmat !!!