Reflect obyekti

ULASHISH

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:

  • in va delete kabi 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 qaytaradi
  • Reflect.defineProperty() Qaytadi true or false

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?

CaseUseWhy
Getting / setting valuesHaAgar sizga izchil qaytariladigan qiymatlar kerak bo‘lsa
Creating new objectsHaReflect.construct() Proxy bilan ishlaydi
Kontekst bilan funksiyani chaqirishHaReflect.apply() func.apply()’ga qaraganda tozaroq
Meta programmingHaPast darajadagi vazifalar uchun mo‘ljallangan
Simple object workYo‘qOddiy 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:

"Qanday qilib ushlangan operatsiyalarni xavfsiz yuborish kerak?"

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!