Proxy Pattern — Design Patterns

Proxy adalah surrogate (wakil) yang mengontrol akses ke object asli. Client mengira dia pegang object asli, padahal dia pegang proxy. Proxy memutuskan: apakah c

Proxy adalah surrogate (wakil) yang mengontrol akses ke object asli. Client mengira dia pegang object asli, padahal dia pegang proxy. Proxy memutuskan: apakah call diteruskan ke asli, ditunda, di-cache, ditolak, atau dimodifikasi.

Empat varian utama:

  1. Virtual Proxy (lazy loading) — object asli baru dibuat saat pertama kali benar-benar dipakai. Cocok untuk object mahal (koneksi, file besar, ORM record).
  2. Protection Proxy — cek authorization sebelum forward call. Tidak punya hak = error.
  3. Cache / Remote Proxy — cache hasil, atau mewakili object yang sebenarnya ada di server lain.
  4. Logging / Smart Reference — track akses untuk observability atau reference counting.

Implementasi minimal — virtual proxy untuk gambar berat:

class RealImage {
  constructor(filename) {
    this.filename = filename;
    this.loadFromDisk(); // MAHAL: baca file, decode
  }
  loadFromDisk() {
    console.log(`Loading ${this.filename} from disk...`);
  }
  display() {
    console.log(`Displaying ${this.filename}`);
  }
}

class ImageProxy {
  constructor(filename) {
    this.filename = filename;
    this.real = null; // belum dibuat
  }
  display() {
    if (!this.real) this.real = new RealImage(this.filename); // baru load saat dipakai
    this.real.display();
  }
}

const gallery = [
  new ImageProxy("cat.jpg"),
  new ImageProxy("dog.jpg"),
  new ImageProxy("bird.jpg"),
];
// Gallery dibuat tanpa load 3 file — cepat
gallery[0].display(); // baru load cat.jpg
// dog.jpg dan bird.jpg tidak pernah di-load kalau tidak dipakai

ES6 Proxy API — proxy built-in JavaScript:

JavaScript modern punya Proxy sebagai fitur bahasa:

const target = { name: "Ani", age: 25 };

const handler = {
  get(obj, prop) {
    console.log(`Akses ${prop}`);
    return prop in obj ? obj[prop] : `(${prop} tidak ada)`;
  },
  set(obj, prop, value) {
    if (prop === "age" && typeof value !== "number") {
      throw new TypeError("age harus number");
    }
    obj[prop] = value;
    return true;
  },
};

const user = new Proxy(target, handler);
user.name;            // "Akses name" → "Ani"
user.email;           // "Akses email" → "(email tidak ada)"
user.age = 30;        // OK
user.age = "dua puluh"; // TypeError!

Handler hook: get, set, has, deleteProperty, apply (kalau target function), dll. ES6 Proxy memungkinkan intercept operasi dasar bahasa, bukan cuma method.

Dunia nyata di ekosistem JS:

Flow akses dengan caching proxy:

Client Proxy (cek cache) Real Object hanya jika cache miss

Kapan pakai:

Kapan JANGAN pakai:

Trade-off:

Proxy powerful tapi tidak transparan untuk debugging. Stack trace di Proxy hook bisa membingungkan. Performance biasanya OK di V8 modern, tapi untuk hot path (game loop, render loop) evaluasi dulu dengan benchmark.

Yang akan kamu pelajari