Reflect obyekti
Reflect obyekti
Reflect - bu JavaScript obyektlarida past darajadagi operatsiyalar uchun usullarga ega obyekt.
Reflect obyekti yordamida obyekt xususiyatlarini bir xil tarzda olishingiz, o‘rnatishingiz, o‘chirishingiz va tekshirishingiz mumkin.
Reflect JavaScript’ga ES6 (2015) standartida qo‘shilgan.
Sizning asboblar to‘plamingiz
Reflect - bu obyektlar bilan xavfsiz va izchil ishlash uchun asboblar to‘plami.
Reflect’dan oldin
Before Reflect, object operations were scattered:
invadeletekabi operatorlardan foydalanish- Using methods like
Object.defineProperty [[Get]]va[[Set]]kabi til mexanizmlaridan foydalanish
Reflect’dan keyin
Reflect barcha obyekt amallarini toza metodlarga jamlaydi:
- Reflect methods unifies object operations
- Reflect usullari operatorlarga qaraganda ko‘proq taxmin qilinadi (in/o‘chirish)
- Reflect metodlari xatolar o‘rniga standart qaytariladigan qiymatlarni beradi
- Reflect usullari meta-dasturlash uchun toza va xavfsizroq
- Reflect usullari Proksi obyekti uchun moslashtirilgan
Misollar
Reflect.has() yordamida siz in operatorini Function sifatida olasiz.
Reflect.delete() yordamida delete operatorini funksiya sifatida olasiz.
Nega Reflect
Reflect xavfsiz va moslashuvchan, ayniqsa proksi-server ichida foydalanilganda.
Reflect.has()
Reflect.has() usuli obyektning o‘ziga xos xususiyati borligini tekshiradi.
Reflect.has() usuli in operatoriga o‘xshaydi.
Xususiyat mavjudligini tekshirish
// Create an Object
const person = {name: "John", lastname: "Doe"};
let answer = Reflect.has(person, "name");
O‘zingiz sinab ko‘ring »
in operatoridan foydalanish bilan bir xil:
let answer = "name" in person;
O‘zingiz sinab ko‘ring »
| Sintaksis |
|---|
| Reflect.has(obj, prop) |
| Xususiyatlar |
| obj — maqsad obyekt prop — tekshiriladigan xususiyat |
| Qaytadi |
| true — agar mavjud bo‘lsa false — agar mavjud bo‘lmasa |
| Exeptions |
| Agar obj obyekt bo‘lmasa, TypeError tashlanadi |
Reflect.deleteProperty()
Reflect.deleteProperty() usuli obyektdan xususiyatni o‘chiradi.
Reflect.deleteProperty() usuli shunga o‘xshash
delete operatori.
Xususiyatni o‘chirish
// Create an Object
const person = {name: "John", lastname: "Doe"};
Reflect.deleteProperty(person, "name");
O‘zingiz sinab ko‘ring »
O‘chirish operatoridan foydalanish bilan bir xil:
delete person.name;
O‘zingiz sinab ko‘ring »
| Sintaksis |
|---|
| Reflect.deleteProperty(obj, prop) |
| Xususiyatlar |
|
obj — maqsadli Object prop - o‘chirish uchun xususiyat |
| Qaytadi |
| true — agar mavjud bo‘lsa false — agar mavjud bo‘lmasa |
| Exeptions |
| Agar obj obyekt bo‘lmasa, TypeError tashlanadi |
Reflect.get()
Reflect.get() usuli xususiyat qiymatini oladi:
Misol
// Create an Object
const user = {name: "Jan", age: 40};
let age = Reflect.get(user, "age");
O‘zingiz sinab ko‘ring »
Quyidagi bilan bir xil:
let age = user.age;
O‘zingiz sinab ko‘ring »
| Sintaksis |
|---|
| Reflect.get(obj, prop [,receiver]) |
| Xususiyatlar |
| obj — maqsadli Object prop - qabul qiluvchini olish xususiyati - agar u oluvchi bo‘lsa, bu qiymat |
| Qaytadi |
| Xususiyatning qiymati |
| Exeptions |
| Agar obj obyekt bo‘lmasa, TypeError tashlanadi |
Reflect.set()
Reflect.set() usuli xususiyat qiymatini belgilaydi:
Misol
// Create an Object
const user = {name: "Jan", age: 40};
Reflect.set(user, "age", 41);
let age = Reflect.set(user, "age");
O‘zingiz sinab ko‘ring »
Quyidagi bilan bir xil:
user.age = 41;
O‘zingiz sinab ko‘ring »
| Sintaksis |
|---|
| Reflect.set(obj, prop, value [,receiver]) |
| Xususiyatlar |
| obj — maqsadli obyekt; prop — o‘rnatiladigan xususiyat; value — o‘rnatiladigan qiymat; receiver — agar u setter bo‘lsa, this qiymati |
| Qaytadi |
| rost - muvaffaqiyat uchun noto‘g‘ri - agar bo‘lmasa |
| Exeptions |
| Agar obj obyekt bo‘lmasa, TypeError tashlanadi |
Reflect.apply()
Reflect.apply() usuli bu qiymat va argument massiviga ega funksiyani chaqiradi.
Misol
function greet(message) {
return message + ", " + this.name;
}
const person = {name: "Jan"};
let msg = Reflect.apply(greet, person, ["Hello"]);
O‘zingiz sinab ko‘ring »
greet.apply() dan foydalanish bilan bir xil:
let msg = greet.apply(person, ["Hello"]);
O‘zingiz sinab ko‘ring »
| Sintaksis |
|---|
| Reflect.apply(function, this, arguments) |
| Xususiyatlar |
| function — maqsad obyekt (funksiya) this — maqsadni chaqirishdagi this qiymati arguments — funksiya argumentlaridan iborat massivsimon obyekt |
| Qaytadi |
| Funksiyadan qaytariladigan qiymat |
| Exeptions |
| Funksiya funksiya bo‘lmasa yoki argumentlar obyekt bo‘lmasa, TypeError tashlanadi |
Reflect.apply() quyidagi hollarda afzal:
- Siz meta-dasturlash bilan shug‘ullanasiz
- Proxy handler ichida bo‘lganingizda
- Izchil xatti-harakat kerak bo‘lganda (jimgina o‘tib ketadigan xatolarsiz)
- JavaScript’ning ichki amallarini aynan takrorlamoqchi bo‘lganingizda
Reflect.construct()
Reflect.construct() usuli yangi operator kabi ishlaydi,
taqdim etilgan argumentlar bilan maqsadning yangi namunasini yaratish.
newTarget subklasslash uchun maxsus new.target qiymatlariga ruxsat beradi.
Misol
// Create a new Array
const colors = Reflect.construct(Array, ["red", "green", "blue"]);
O‘zingiz sinab ko‘ring »
Yangi kalit so‘z bilan bir xil:
// Create a new Array
const colors = new Array(["red", "green", "blue"]));
O‘zingiz sinab ko‘ring »
| Sintaksis |
|---|
| Reflect.construct(obj, args [, newTarget]) |
| Xususiyatlar |
| obj - konstruktor obyekti args - uzatiladigan argumentlarning massivga o‘xshash obyekti newTarget - konstruktor |
| Qaytadi |
| Argumentlar ro‘yxatidan yaratilgan yangi obyekt |
| Exeptions |
| Agar obj yoki newTarget konstruktor bo‘lmasa yoki args obyekt bo‘lmasa, TypeError tashlanadi |
Reflect.defineProperty()
Reflect.defineProperty() xususiyatni belgilaydi yoki o‘zgartiradi.
Misol
// Create an Object
const user = {};
// Add a Property
Reflect.defineProperty(user, "id", {
value: 123,
writable: false
});
O‘zingiz sinab ko‘ring »
Object.defineProperty() dan foydalanish bilan bir xil:
// Add a Property
Object.defineProperty(user, "id", {
value: 123,
writable: false
});
O‘zingiz sinab ko‘ring »
| Sintaksis |
|---|
| Reflect.defineProperty(obj, prop, attributes) |
| Xususiyatlar |
| obj — maqsadli Object prop - atributlarni aniqlash xususiyati - xususiyat atributlarining massivga o‘xshash obyekti |
| Qaytadi |
| Exeptions |
| Agar obj obyekt bo‘lmasa yoki atributlar obyekt bo‘lmasa, TypeError tashlanadi |
Proxy ichida Reflect.defineProperty()
Proxy ichida Reflect.defineProperty() dan foydalanish shart
Agar proksi-serverda ishlatilsa, defineProperty tuzog‘i trueni qaytarishi kerak
yoki false .
Object.defineProperty()maqsad obyektni qaytaradiReflect.defineProperty()Qaytaditrueorfalse
Reflect.ownKeys()
Reflect.ownKeys(obj) usuli obyektning o‘z xossalari massivini qaytaradi
Object.getOwnPropertyNames() va Object.getOwnPropertySymbols() ni birlashtirishga o‘xshash kalitlar (string va Symbolga asoslangan).
Misol
const sym = Symbol("secret");
const obj = { a: 1, [sym]: 2 };
let keys = Reflect.ownKeys(obj);
O‘zingiz sinab ko‘ring »
Object.keys()’dan foydalanish bilan deyarli bir xil:
let keys = Object.keys(obj);
O‘zingiz sinab ko‘ring »
| Sintaksis |
|---|
| Reflect.ownKeys(obj) |
| Xususiyatlar |
| obj — maqsadli Object |
| Qaytadi |
| Obyektning o‘ziga xos xususiyat kalitlari, jumladan stringlar va belgilar massivi |
| Exeptions |
| Agar obj obyekt bo‘lmasa, TypeError tashlanadi |
Nega Reflect’dan foydalanish kerak?
Reflect.ownKeys() symbol kalitlarni ham qaytaradi.
Object.keys() does not.
Reflect.isExtensible()
Reflect.isExtensible() metodi obyektning kengaytiriladigan ekanligini (unga xususiyat qo‘shish mumkinligini) tekshiradi; u Object.isExtensible()’ga o‘xshaydi.
Misol
let answer = Reflect.isExtensible(obj);
Object.isExtensible()’dan foydalanish bilan bir xil:
let answer = Object.isExtensible(obj);
| Sintaksis |
|---|
| Reflect.isExtensible(obj) |
| Xususiyatlar |
| obj — maqsadli Object |
| Qaytadi |
| rost - kengaytirilishi mumkin noto‘g‘ri - emas |
| Exeptions |
| Agar obj obyekt bo‘lmasa, TypeError tashlanadi |
Nega Reflect’dan foydalanish kerak?
Object.isExtensible() foydalanuvchi metodi hisoblanadi - ichki trap mexanizmining bir qismi emas.
Reflect.isExtensible() bevosita ichki [[IsExtensible]] metodiga mos keladi.
Reflect.isExtensible() primitiv maqsadlarni to‘g‘ri qayta ishlaydi, bu esa proxy qilinganda muhim ahamiyatga ega.
Reflect.isExtensible(1); // TypeError
Object.isExtensible(1); // false (does not throw)
Reflect’dan qachon foydalanish kerak?
| Case | Use | Why |
|---|---|---|
| Getting / setting values | Ha | Agar sizga izchil qaytariladigan qiymatlar kerak bo‘lsa |
| Creating new objects | Ha | Reflect.construct() Proxy bilan ishlaydi |
| Kontekst bilan funksiyani chaqirish | Ha | Reflect.apply() func.apply()’ga qaraganda tozaroq |
| Meta programming | Ha | Past darajadagi vazifalar uchun mo‘ljallangan |
| Simple object work | Yo‘q | Oddiy JS sintaksisidan foydalaning |
Proksi bilan aks ettirish (juda keng tarqalgan)
Proxy obyektlar ustidagi amallarni ushlab qolish imkonini beradi:
Misol
// Create an Object
const user = { name: "Jan", age: 40 };
// Create a Proxy
const proxy = new Proxy(user, {
set(target, property, value) {
log(property + ": " + value);
// safe forwarding
return Reflect.set(target, property, value);
}
});
O‘zingiz sinab ko‘ring »
Reflect xavfsiz va yagona tarzdagi uzatish chaqiruvlarini ta’minlay oladi.
Reflect Proxy’ning oddiy obyekt kabi ishlashini ta’minlaydi.
Proxy va Reflect
Avval Proxy ishlab chiqilgan. Reflect undan keyin ishlab chiqilgan.
Proksi-server JavaScript-ni ishlab chiquvchilarga quyidagilarga ruxsat berish uchun yaratilgan:
- Intercept property access
- Override default property behaviors
- Validate data
- Wrap functions
- Virtualize objects
- Create reactive Obyektlar
Proxy g‘oyasi ES6 (2015) ni loyihalash bosqichida, Reflect hali mavjud bo‘lmagan paytda ishlab chiqilgan.
Biroq Proxy’da katta muammo bor edi:
JavaScript ko‘p operatsiyalarning funktsional ekvivalentiga ega emas edi.
Ushbu cheklov tufayli Reflect ixtiro qilindi.
JavaScript Reflect tarixi
Reflect Proxy’ga kerak bo‘lgani uchun joriy etilgan.
Before Reflect:
- delete, in, new operatorlar edi
- some operations threw errors
- object operations returned inconsistent values
- xususiyatlarga murojaat qilishning umumiy (generic) varianti mavjud emas edi
- konstruktor chaqiruvlarini uzatishning imkoni yo‘q edi
Bu Proxy’ni xavfsiz amalga oshirishni imkonsiz qilgan edi.
Shu sababli ES6 (2015) Reflect’ni quyidagilar uchun joriy etdi:
- har bir ichki amalning toza, funksiyaga asoslangan versiyalarini taqdim etish
- obyektlar o‘rniga oldindan aytib bo‘ladigan mantiqiy (boolean) qiymatlarni qaytarish
- avoid unnecessary errors
- mirror the JavaScript engine’s behavior
- Proxy tuzoqlariga (traps) ishonchli uzatish yo‘lini berish
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
