JS metaprogrammalash
Metaprogramming
Metadasturlash deganda dastur o‘zini o‘zi boshqarishi mumkin bo‘lgan bir qancha usullarni nazarda tutadi:
- Modify objects at runtime
- Inspect objects at runtime
- Control objects at runtime
- Intercept running operations
- Funksiyalar va sinflarni o‘zgartirish
- Generate dynamic code
Oson tushuntirish
Normally, code handles data.
Meta dasturlash bilan kod kodni boshqaradi.
Obyektlarni tekshirish
Object.keys() usuli yordamida siz obyekt xususiyatlarini tekshirishingiz mumkin.
Object.keys() dan foydalanish metadasturlashning oddiy misolidir.
Misol
Ushbu kod boshqa kod qismini (obyektni) tahlil qilmoqda:
// Create an Object
const user = {name: "Jan", age: 40};
// Fill Array with Object keys
const myArr = Object.keys(user);
O‘zingiz sinab ko‘ring »
Obyektlarni o‘zgartirish
Odatiy metaprogrammalash vazifalaridan biri — obyekt xatti-harakatini o‘zgartirish:
Misol
// Create an Object
const person = {name: "John", age: 41};
// Define "name" to return "secret"
Object.defineProperty(person, "name", {
get() { return "secret"; }
});
let name = person.name;
O‘zingiz sinab ko‘ring »
Dinamik kod yaratish
Metaprogramming involves dynamic code generation.
JavaScript ish vaqtida (runtime) funksiyalar yarata oladi:
Metadasturlash misollari
| Consept | Tavsif |
|---|---|
| Validation | Xususiyatga o‘rnatilishi mumkin bo‘lgan qiymatlarni cheklash |
| Logging | Proxy yordamida xususiyat o‘zgarishlarini ko‘rsatish |
| Debugging | Proxy yordamida amalni ushlab qolish (intercept) |
| Frameworks | Vue, MobX va Svelte holat o‘zgarishlarini aniqlash uchun metaprogrammalashdan foydalanadi |
| ORM / database mapping | Obyektlarni o‘rash va ma’lumotlar bazasi sxemasi asosida maydonlarni yaratish |
| Dynamic APIs | Ish vaqtida funksiyalar yoki obyekt tuzilmalarini yaratish |
Proxy yordamida metadasturlash
Proksi va Reflect ikkita Object JavaScript-da meta-darajada dasturlash imkonini beradi.
Proksi-server o‘qish yoki yozish kabi mulkiy operatsiyalarni to‘xtatish uchun ishlatilishi mumkin.
Quyidagi misolda:
- user obyekti Proxy bilan o‘raladi
- Proxy xususiyat o‘rnatilganda har safar log yozish uchun set() trap’dan foydalanadi
Misol
Xususiyat qiymatlaridagi o‘zgarishlarni log qilish:
// Create an Object
const user = {name: "Jan", age: 40};
// Wrap the Object in a Proxy
const proxy = new Proxy(user, {
// Use a set trap
set(target, property, value) {
// Log changes
log(property + "; " + value);
return target[property];
}
});
// Change Properties
proxy.name = "John";
proxy.age = 45;
proxy.name = "Paul";
O‘zingiz sinab ko‘ring »
Reflect bilan Proxy
Reflect makes Proxy behavior match normal object behavior
Quyidagi misolda:
- user obyekti Proxy bilan o‘raladi
- Proxy xususiyat o‘rnatilganda log yozish uchun set() trap’dan foydalanadi
- set trap xavfsiz yo‘naltirish uchun Reflect.set() dan foydalanadi
Misol
Xususiyat qiymatlaridagi o‘zgarishlarni log qilish:
// Create an Object
const user = {name: "Jan", age: 40};
// Wrap the Object in a Proxy
const proxy = new Proxy(user, {
// Use a set trap
set(target, property, value) {
// Log changes
log(property + ": " + value);
// Safe forwarding with Reflect
return Reflect.set(target, property, value);
}
});
O‘zingiz sinab ko‘ring »
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
