Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Cách tránh circular reference trong OOP JavaScript

Circular reference xảy ra khi 2 object tham chiếu lẫn nhau (A→B, B→A).

Tác hại

  • Trên trình duyệt cũ: gây rò rỉ bộ nhớ (memory leak) do GC tham chiếu đếm (reference-counting) không xử lý được chu trình.
  • GC hiện đại (mark-and-sweep) đã xử lý tốt chu trình — không còn leak.
  • Tuy nhiên, từ góc độ thiết kế: code smell, coupling chặt, thay đổi một object kéo theo object kia.

Ví dụ

let dog = new Dog();
let person = new Person();
dog.owner = person;
person.pet = dog; // circular

Giải pháp

  • Chỉ giữ 1 chiều tham chiếu (ví dụ: dog.owner), truy xuất ngược qua ID/map khi cần.
  • Dùng WeakMap để map ngược mà không cản trở GC.
  • Nếu thực sự cần 2 chiều — chấp nhận, GC hiện đại xử lý tốt.

Nguyên tắc: Ưu tiên thiết kế đơn hướng, tránh coupling không cần thiết.