Artikel ini akan menarik bagi mereka yang menggunakan Proksi untuk reaktivitas atau refleksi.
Perilaku metode JS diketahui oleh kita jika kita hanya menggunakannya dalam suatu objek.
Jika suatu metode dilewatkan melalui properti ke objek lain, maka ia bekerja dengan itu, yang didefinisikan dalam kerangka kerja objek lain.
let obj1={prop1:'HEllo',method1(){console.log(this);}} let obj2={method2:obj1.method1}; obj2.method2();
Ini harus dipahami dengan jelas saat menggunakan Proxy.
class MyProxy{ constructor(target){ return new Proxy(target,this); } get(target,prop){ console.log(target,prop);
Hasilnya adalah console.log (Label2) itu; akan memberi kita objek Proxy, setelah itu Proxy akan bekerja pada target dan prop (lihat Label1); tapi kodenya sepertinya berfungsi. Apa yang mandi?
Metode mulai berkomunikasi dengan objek (ini) melalui Proxy. Ini nyaman dan logis ketika kita menulis refleksi (refleksi dari properti objek dan perubahan perilaku tanpa mengubah objek). Tetapi jika kita tidak membutuhkannya dan kita membutuhkan metode untuk bekerja secara khusus dengan objek target, apa yang harus kita lakukan? Mengapa kita memperlambat kodenya?
Selain itu, jika kami memperkenalkan lebih banyak logika, misalnya, filter properti, dll., Kode mungkin secara tidak sengaja berubah. Dan ketika menulis kode reaktif, ada "roll-over". (Misalnya, ketika meminta metode dan eksekusi selanjutnya, metode meminta properti melalui proksi yang peristiwa telah diposting). Artinya, peristiwa mulai terjadi di tempat yang tidak perlu dan tidak diharapkan.
Bagaimana cara memperbaikinya
Seperti yang dipahami, ini sudah ditimpa untuk metode sebelum memanggil Handler.get di Proxy. Anda hanya perlu mendefinisikan ulang lagi sebagai berikut:
let answer=target[prop]; if(typeof target[prop] ==='function'){ answer=target[prop].bind(target); }
Kami mendapatkan kode berikut:
class MyProxy{ constructor(target){ return new Proxy(target,this); } get(target,prop){
Akhirnya, sebagai bonus.
Menciptakan rantai reaktivitas / refleksi. Setiap objek bersarang akan menjadi proxy:
class MyProxy{ constructor(target){ return new Proxy(target,this); } get(target,prop){ let answer; let tp=target[prop];
Terima kasih atas perhatian anda!