Obyektdan kalitlarni/qiymatlarni olishning ko’plab usullari mavjud.
Ularning aksariyati obyektning o’zida ishlaydi, prototipni hisobga olmaganda, keling ularni esga olamiz:
- Object.keys(obj) / Object.values(obj) / Object.entries(obj) – sanab o’tiladigan o’z matnlar nomlari/qiymatlari/kalit-qiymat juftliklari massivini qaytaradi. Ushbu usullar faqat sanab o’tiladigan xususiyatlarni va matnlarni kalit sifatida ro’yxatini beradi.
Agar biz ramziy xususiyatlarni istasak:
- Object.getOwnPropertySymbols(obj) – barcha o’ziga xos ramziy xususiyat nomlari massivini qaytaradi.
Agar biz sanab bo’lmaydigan xususiyatlarni xohlasak:
- Object.getOwnPropertyNames(obj) – o’zlarining barcha matn xususiyatlarining nomlarini qaytaradi.
Agar biz barcha xususiyatlarni xohlasak:
- Reflect.ownKeys(obj) – barcha mulk nomlari massivini qaytaradi.
Ushbu usullar ularning qaysi xususiyatlarini qaytarishi haqida bir oz farq qiladi, ammo ularning barchasi obyektning o’zida ishlaydi. Prototipdagi xususiyatlar ro’yxatga kiritilmagan.
for…in tsikl
for..in
tsikli boshqacha: u ham meros qilib olingan xususiyatlarni ko’rib chiqadi.
Masalan:
let animal = {
eats: true
};
let rabbit = {
jumps: true,
__proto__: animal
};
// faqat o'z kalitlari
alert(Object.keys(rabbit)); // jumps
// meros kalitlari ham
for(let prop in rabbit) alert(prop); // jumps, then eats
Agar biz xohlamagan narsa bo’lsa va biz merosxo’rlik xususiyatlarini istisno qilmoqchi bo’lsak, o’rnatilgan usul mavjud obj.hasOwnProperty(key): u true
ni qaytaradi, agar obj
o’ziga xos key
nomli (merosxo’r bo’lmagan) xususiyatga ega bo’lsa.
Shunday qilib, biz meros qilib olingan xususiyatlarni filtrlashimiz mumkin (yoki ular bilan boshqa biror narsa qilishimiz mumkin):
let animal = {
eats: true,
};
let rabbit = {
jumps: true,
__proto__: animal,
};
for (let prop in rabbit) {
let isOwn = rabbit.hasOwnProperty(prop);
alert(`${prop}: ${isOwn}`); // jumps: true, then eats: false
}
Bu yerda bizda quyidagi meros zanjiri mavjud: rabbit
, keyin animal
, so’ngra Object.prototype
(chunki animal
literal obyekt {...}
, shuning uchun u sukut bo’yicha) va keyin null
yuqorida:
E’tibor bering, bitta kulgili narsa bor. rabbit.hasOwnProperty
usuli qayerdan keladi? Zanjirga qarab, usul Object.prototype.hasOwnProperty
tomonidan taqdim etilganligini ko’rishimiz mumkin. Boshqacha qilib aytganda, bu meros bo’lib qolgan.
…Lekin nima uchun hasOwnProperty
ko’rinmaydi for..in
tsikl, u barcha meros xususiyatlarini ro’yxatlar bo’lsa? Javob oddiy: uni sanab bo’lmaydi. Xuddi Object.prototype
ning barcha boshqa xususiyatlari kabi. Shuning uchun ular ro’yxatga olinmagan.
Xulosa
Aksariyat usullar meros qilib olingan xususiyatlarni e’tiborsiz qoldiradi, bundan tashqari for..in
bundan mustasno.
Ikkinchisi uchun biz obj.hasOwnProperty(key) dan foydalanishimiz mumkin: agar obj
ning key
nomli o’ziga xos (meros emas) xususiyati bo’lsa, u true
ni qaytaradi.
Izohlar
<code>
yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>
yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)