Rumah  >  Artikel  >  hujung hadapan web  >  Berkongsi idea untuk melaksanakan suntikan kebergantungan dalam kemahiran JavaScript_javascript

Berkongsi idea untuk melaksanakan suntikan kebergantungan dalam kemahiran JavaScript_javascript

WBOY
WBOYasal
2016-05-16 16:19:58756semak imbas

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.

Salin kod Kod adalah seperti berikut:

var services = { abc : 123, def : 456, ghi : 789 } // Anggap bahawa beberapa Perkhidmatan
telah ditakrifkan fungsi Perkhidmatan(abc, ghi){
This.write = function(){
console.log(abc);
console.log(ghi);
}
}
fungsi Activitor(func){
var obj;
// Laksanakan
Kembalikan obj;
}

Penyelesaian:

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:

Salin kod Kod adalah seperti berikut:

fungsi getFuncParams(func) {
var padanan = func.toString().match(/^functions*[^(]*(s*([^)]*))/m);
Jika (padan && padan.panjang > 1)
            kembalikan padanan[1].ganti(/s*/, '').split(',');
Kembalikan [];
};

Pada ketika ini, tatasusunan senarai parameter func diperolehi.

2. Cari kebergantungan berdasarkan senarai parameter:

Selepas mendapat senarai parameter, iaitu, mendapatkan senarai kebergantungan, sangat mudah untuk menghantar kebergantungan sebagai parameter.

Salin kod Kod adalah seperti berikut:

var params = getFuncParams(func);
untuk (var i dalam params) {
params[i] = perkhidmatan[params[i]];
}

3. Lulus parameter pergantungan dan nyatakan:

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:

Salin kod Kod adalah seperti berikut:

fungsi Activitor(func){
var obj = {};
func.apply(obj, params);
Kembalikan obj;
}

Pada ketika ini kita boleh mencipta contoh func dan lulus parameter yang diperlukan oleh func.

4. Cetak dan uji:

Kod penuh:

Salin kod Kod adalah seperti berikut:

var
// Anggap bahawa beberapa Perkhidmatan
telah ditakrifkan Perkhidmatan = { abc: 123, def: 456, ghi: 789 },

// 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();


Konsol mencetak dengan jayanya!
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn