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
setphải trảtruenếu thành công; ở strict mode trả falsy sẽ némTypeError. - Dùng
Reflect.*vớireceiverđể getter/setter kế thừa vàthishoạ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,Datevà private field#xdựa vào internal slot nên gọi method qua proxy bịTypeErrornếu không bind lại. - Không polyfill được hoàn toàn (nên Vue 3 bỏ IE11).