</>
⌕
Senior #proxy#reflect#metaprogramming#reactivity

Proxy và Reflect là gì? Ứng dụng và hạn chế

⚡ Trả lời nhanh

`Proxy` bọc một object và chặn thao tác cơ bản (get, set, has, deleteProperty, ownKeys, apply...) qua các trap. `Reflect` cung cấp phiên bản mặc định của các thao tác đó, dùng trong trap để giữ đúng ngữ nghĩa. Ứng dụng: reactivity (Vue 3), validation, logging, default value.

Ví dụ

main.js · sửa được
  • Trap set phải trả true nếu thành công; ở strict mode trả falsy sẽ ném TypeError.
  • Dùng Reflect.* với receiver để getter/setter kế thừa và this hoạt động đúng.
  • Có invariant: trap không được nói dối về property non-configurable, nếu không sẽ ném lỗi.

Hạn chế

  • Chậm hơn truy cập trực tiếp, khó tối ưu; không nên đặt ở hot path.
  • Proxy khác danh tính với target (p !== target); Map, Set, Date và private field #x dựa vào internal slot nên gọi method qua proxy bị TypeError nếu không bind lại.
  • Không polyfill được hoàn toàn (nên Vue 3 bỏ IE11).
🃏 Ôn bằng flashcard