Pada masa kini, setiap rangka kerja sedang dimodulatkan, malah javascript bahagian hadapan tidak terkecuali. Setiap modul bertanggungjawab untuk fungsi tertentu, dan terdapat saling bergantung antara modul Jadi persoalan timbul: Bagaimana untuk melaksanakan suntikan pergantungan dalam JavaScript? (Suntikan kebergantungan JavaScript, semua rangka kerja utama mempunyai pelaksanaan yang sepadan, di sini kita hanya mempelajari idea pelaksanaan)
Keperluan berikut:
Anggapkan bahawa sudah ada set Nilai Kunci modul perkhidmatan yang ditentukan, func ialah perkhidmatan baharu yang ditambah dan senarai parameter ialah kebergantungan perkhidmatan.
Melalui beberapa mekanisme (pantulan?), keluarkan senarai parameter yang ditakrifkan oleh fungsi dan tetapkan nilai satu demi satu. Kemudian nyatakan fungsi melalui beberapa mekanisme (Activitor?).
Penyelesaian:
1 Dapatkan senarai parameter fungsi:
Bagaimana untuk mendapatkan senarai parameter? Perkara pertama yang terlintas di fikiran saya ialah mekanisme refleksi. Jadi adakah terdapat refleksi dalam javascript? Pada masa ini, saya hanya tahu cara menggunakan fungsi eval(str), tetapi nampaknya tiada pelaksanaan yang berkaitan untuk mendapatkan senarai parameter. Melihat definisi func.arguments sekali lagi, sifat ini hanya sah apabila func dipanggil dan parameter diluluskan, dan ia tidak dapat memenuhi keperluan.
Bolehkah kita mendapatkan senarai parameter dengan memproses rentetan selepas func.toString()?
Mulakan dan cuba:
2. Cari kebergantungan berdasarkan senarai parameter:
Selepas mendapat senarai parameter, iaitu, mendapatkan senarai kebergantungan, sangat mudah untuk menghantar kebergantungan sebagai parameter.
Kami tahu bahawa terdapat dua fungsi yang dipanggil func.constructor dalam javascript: call(thisArg,[arg[,arg,[arg,[…]]]]) dan apply(thisArg,args...), kedua-duanya boleh dijadikan instantiated. Parameter pertama fungsi panggilan ialah penunjuk ini, dan selebihnya ialah senarai parameter Ini sesuai digunakan apabila senarai parameter func diketahui, tetapi tidak memenuhi keperluan saya. Melihat pada fungsi guna kedua, parameter pertama juga penunjuk ini, dan parameter kedua ialah tatasusunan parameter Apabila ia dipanggil, ia secara automatik akan memberikan nilai kepada senarai parameter fungsi satu demi satu, yang hanya memenuhi saya. keperluan.
Kodnya kira-kira seperti berikut:
4. Cetak dan uji:
Kod penuh:
// Dapatkan senarai parameter fungsi (senarai pergantungan)
GetFuncParams = fungsi (func) {
var padanan = func.toString().match(/^functions*[^(]*(s*([^)]*))/m);
Jika (padan && padan.panjang > 1)
kembalikan padanan[1].replace(/s /, '').split(',');
kembali [];
},
// Isikan parameter (pergantungan) berdasarkan senarai parameter (senarai pergantungan)
setFuncParams = fungsi (params) {
untuk (var i dalam params) {
params[i] = perkhidmatan[params[i]];
}
pulangkan params;
};
// Pengaktif
fungsi Activitor(func) {
var obj = {};
func.apply(obj, setFuncParams(getFuncParams(func)));
Kembalikan obj;
}
//Tentukan Perkhidmatan baharu
fungsi Perkhidmatan(abc, ghi) {
This.write = fungsi () {
console.log(abc);
console.log(ghi);
}
}
// Perkhidmatan Segera dan kaedah panggilan
var service = Activitor(Service);
service.write();