- Reflect - JavaScript | MDN
- The Reflect namespace object contains static methods for invoking interceptable JavaScript object internal methods. The methods are the same as those of proxy handlers.
Khi phát triển server với Node.js, người ta thường bị cám dỗ bởi vô số ưu điểm của Spring.
Bởi vì nó có cấu trúc tốt, có hệ thống và rất khó để tùy chỉnh một cách tùy tiện.
Vì vậy, trong cộng đồng Node.js, framework Nest.js đã ra đời.
Ít nhất thì nó cũng cho phép phát triển server theo một cấu trúc có hệ thống, giống như Spring.
Tuy nhiên, DI của Spring sử dụng reflection thời gian chạy để hỗ trợ thực hiện DI ở cấp độ ngôn ngữ.
Dotnet cũng tương tự, nó sử dụng reflection dựa trên thuộc tính để theo dõi và thực hiện DI.
Vậy Nest.js thực hiện DI như thế nào?
Spring và Dotnet có ngôn ngữ cơ sở là ngôn ngữ biên dịch, nên chúng hỗ trợ reflection ở cấp độ ngôn ngữ.
Còn ecma script thì chỉ là... một ngôn ngữ thông dịch tầm thường thôi chứ?
Dưới đây là một ví dụ trong hướng dẫn sử dụng Nest.js.
Rõ ràng là mã được viết bằng TypeScript này, sau khi được biên dịch, các thẻ kiểu dữ liệu sẽ biến mất, và vì không biết kiểu dữ liệu của các đối số cần thiết trong constructor của lớp, nên...
Giải pháp nằm trong đặc tả ngôn ngữ.
Reflect
May mắn thay, có một chức năng được xây dựng sẵn ở cấp độ ngôn ngữ cho phép thêm siêu dữ liệu vào từng đối tượng.
Đó chỉ là một chức năng đơn giản để thêm và lấy siêu dữ liệu từ đối tượng thôi.
Vì vậy, TypeScript đã nghĩ rằng:
Nếu vậy, khi biên dịch lớp, ta có thể thêm thông tin kiểu dữ liệu vào siêu dữ liệu không?
Vì vậy, TypeScript đã thêm thông tin về các đối số cần thiết cho constructor của lớp vào Reflect ở mọi nơi có trình trang trí lớp.
Không có phép biến đổi hay ma thuật đen nào ở đây, chỉ là chức năng của trình biên dịch TypeScript mà thôi.
Nếu thông tin về kiểu dữ liệu của các đối số cần thiết cho constructor được thêm vào siêu dữ liệu của lớp,
thì chúng ta có thể gọi lớp và biết được kiểu dữ liệu, từ đó có thể thêm chúng vào.
Bạn có thể xem cách triển khai này trong NestJS, nhưng nó khá dài dòng, vì vậy tôi khuyên bạn nên sử dụng thư viện khác.
Thư viện này được tạo bởi microsoft, nên mã nguồn khá sạch sẽ.
Tôi khuyên bạn nên xem qua, và tôi xin kết thúc bài viết tại đây.
Bình luận0