📛 Meta Programming JavaScript

Panduan lengkap teknik meta programming di JavaScript untuk manipulasi kode tingkat lanjut

📌 Elements

💡 Dasar Meta Programming

Meta programming adalah teknik memprogram program yang memanipulasi atau menghasilkan kode lain. JavaScript menyediakan beberapa fitur untuk meta programming seperti Proxy, Reflect, dan Symbol.

meta-basics.js
// Proxy - Membungkus objek dengan custom behavior
const target = { message: "hello" };
const handler = {
  get(target, prop) {
    return target[prop].toUpperCase();
  }
};
const proxy = new Proxy(target, handler);
console.log(proxy.message); // "HELLO"

// Symbol - Membuat identifier unik
const id = Symbol('id');
const obj = { [id]: 123 };
console.log(obj[id]); // 123

📝 Penjelasan Detail:

â€ĸ Proxy - Membungkus objek untuk mengubah perilaku dasar
â€ĸ Reflect - Metode untuk operasi objek yang dapat dipantulkan
â€ĸ Symbol - Nilai primitif unik yang tidak bisa diubah
â€ĸ eval - Menjalankan string sebagai kode (hati-hati penggunaannya)
â€ĸ Function constructor - Membuat fungsi dari string

đŸ› ī¸ Features

meta-features.js
// Reflect API
const obj = { x: 1, y: 2 };
console.log(Reflect.get(obj, 'x')); // 1
Reflect.set(obj, 'z', 3);
console.log(obj.z); // 3

// Well-known Symbols
class MyClass {
  [Symbol.toStringTag] = 'MyClass';
}
console.log(new MyClass().toString()); // [object MyClass]

// Generator Functions
function* idGenerator() {
  let id = 1;
  while(true) yield id++;
}
const gen = idGenerator();
console.log(gen.next().value); // 1

â„šī¸ Kasus Penggunaan Meta Programming

Meta programming berguna untuk: validasi data, logging otomatis, ORM, mocking, implementasi DSL (Domain Specific Language), dan framework tingkat lanjut.

📊 Basic Tables

meta-tables.js
// Trap Methods pada Proxy
get       // Trap untuk membaca properti
set       // Trap untuk menulis properti
apply     // Trap untuk pemanggilan fungsi
construct // Trap untuk operator new
has       // Trap untuk operator in

// Well-known Symbols
Symbol.iterator    // Untuk iterasi objek
Symbol.toStringTag // Mengubah perilaku toString
Symbol.hasInstance  // Custom instanceof behavior
Symbol.species    // Menentukan constructor untuk derived objects

📝 Penjelasan Detail:

â€ĸ Proxy Traps - Memungkinkan intercept operasi dasar objek
â€ĸ Reflect Methods - Menyediakan operasi yang sama dengan traps untuk consistency
â€ĸ Well-known Symbols - Mengubah perilaku built-in JavaScript
â€ĸ Generator Functions - Fungsi yang bisa dihentikan dan dilanjutkan
â€ĸ Iterator Protocol - Mendefinisikan cara mengiterasi objek kustom

🚀 Advanced Table

advanced-meta.js
// Membuat DSL (Domain Specific Language)
function createDSL(methods) {
  return new Proxy({}, {
    get(target, prop) {
      return methods[prop] || (() => console.log(`Called ${prop}`));
    }
  });
}
const dsl = createDSL({ save: () => console.log('Saving...') });
dsl.save(); // "Saving..."
dsl.delete(); // "Called delete"

// Membuat ORM sederhana
class Model {
  constructor(attrs) {
    return new Proxy(this, {
      get(target, prop) {
        return attrs[prop] || target[prop];
      }
    });
  }
  save() { console.log('Saving model...'); }
}
const user = new Model({ name: 'John' });
console.log(user.name); // "John"

â„šī¸ Aplikasi Lanjutan

Meta programming memungkinkan pembuatan: sistem validasi dinamis, ORM/ODM, mocking libraries, testing frameworks, dan embedded DSLs untuk domain spesifik.

💡 Pro Tips

đŸŽ¯ Best Practices Meta Programming

Gunakan meta programming dengan bijak, dokumentasikan dengan baik, dan pertahankan readability kode. Jangan terlalu cerdas sampai kode sulit dipahami.

meta-tips.js
// ✅ Good - Proxy untuk validasi
function createValidator(target, schema) {
  return new Proxy(target, {
    set(target, prop, value) {
      if (schema[prop] && !schema[prop](value)) {
        throw new Error(`Invalid value for ${prop}`);
      }
      target[prop] = value;
      return true;
    }
  });
}

// ❌ Avoid - Terlalu banyak magic
const magic = new Proxy({}, {
  get(target, prop) {
    return new Function('...args', `console.log("Called ${prop} with", args)`);
  }
});
// Sulit dipahami dan debug

📝 Penjelasan Detail:

â€ĸ Gunakan untuk kasus yang tepat - Seperti validasi, logging, atau abstraksi kompleks
â€ĸ Dokumentasikan dengan baik - Kode meta programming bisa membingungkan
â€ĸ Pertahankan readability - Jangan mengorbankan kejelasan untuk kecerdasan
â€ĸ Hindari eval dan Function constructor - Kecuali benar-benar diperlukan
â€ĸ Gunakan TypeScript - Untuk membantu memahami kode yang kompleks
â€ĸ Test secara menyeluruh - Meta programming bisa memiliki edge cases yang tidak terduga

🌐 Info

📚 Library Meta Programming

Beberapa library yang menggunakan meta programming: MobX (reactive state), Immer (immutable updates), TypeORM (database ORM), dan berbagai testing frameworks.

📝 Sumber Belajar Lanjutan:

â€ĸ MDN Proxy and Reflect - Dokumentasi resmi Mozilla
â€ĸ ECMAScript Spec - Spesifikasi lengkap meta programming
â€ĸ Exploring ES6 - Buku oleh Axel Rauschmayer
â€ĸ Metaprogramming in JavaScript - Artikel dan tutorial
â€ĸ Design Patterns dengan Proxy - Implementasi pattern seperti Decorator