JS metaprogrammalash

ULASHISH

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:

Misol

const fn = new Function("a", "b", "return a + b");
O‘zingiz sinab ko‘ring »

Metadasturlash misollari

ConseptTavsif
ValidationXususiyatga o‘rnatilishi mumkin bo‘lgan qiymatlarni cheklash
LoggingProxy yordamida xususiyat o‘zgarishlarini ko‘rsatish
DebuggingProxy yordamida amalni ushlab qolish (intercept)
FrameworksVue, MobX va Svelte holat o‘zgarishlarini aniqlash uchun metaprogrammalashdan foydalanadi
ORM / database mappingObyektlarni o‘rash va ma’lumotlar bazasi sxemasi asosida maydonlarni yaratish
Dynamic APIsIsh 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!