ทุกวันนี้เฟรมเวิร์กทั้งหมดเป็นแบบแยกส่วนและแม้แต่จาวาสคริปต์ส่วนหน้าก็ไม่มีข้อยกเว้น แต่ละโมดูลรับผิดชอบฟังก์ชั่นบางอย่างและมีการพึ่งพาซึ่งกันและกันระหว่างโมดูล ดังนั้นคำถามคือ: จะใช้การฉีดพึ่งพาใน JavaScript ได้อย่างไร? (การฉีดขึ้นอยู่กับการพึ่งพาของ JavaScript กรอบหลักมีการใช้งานที่สอดคล้องกันมีการเรียนรู้แนวคิดการใช้งานเท่านั้นที่นี่)
ข้อกำหนดต่อไปนี้:
สมมติว่ามีการรวบรวมคีย์-ค่าโมดูลบริการที่กำหนดไว้แล้ว Func เป็นบริการใหม่ที่เพิ่มเข้ามาและรายการพารามิเตอร์คือการพึ่งพาบริการ
การคัดลอกรหัสมีดังนี้:
บริการ var = {abc: 123, def: 456, ghi: 789}; // สมมติว่ามีการกำหนดบริการบางอย่าง
บริการฟังก์ชั่น (ABC, GHI) {
this.write = function () {
console.log (ABC);
console.log (ghi);
-
-
ฟังก์ชั่น Activitor (func) {
var obj;
// ทำให้สำเร็จ
คืน OBJ;
-
สารละลาย:
ผ่านกลไกบางอย่าง (การสะท้อนกลับ?) นำรายการพารามิเตอร์ที่กำหนดโดย FUNC และกำหนดค่าทีละตัว จากนั้นผ่านกลไกบางอย่าง (activitor?) func จะถูกสร้างอินสแตนซ์
สารละลาย:
1. รับรายการพารามิเตอร์ของ func:
จะรับรายการพารามิเตอร์ได้อย่างไร? สิ่งแรกที่นึกถึงคือกลไกการสะท้อน ดังนั้นมีการไตร่ตรองใน JavaScript หรือไม่? มันควรจะอยู่ที่นั่น ฉันรู้วิธีใช้ฟังก์ชัน Eval (STR) ในขณะนี้ แต่ดูเหมือนว่าไม่มีการใช้งานที่เกี่ยวข้องสำหรับการได้รับรายการพารามิเตอร์ มาดูคำจำกัดความของ Func.arguments คุณสมบัตินี้ใช้ได้เฉพาะเมื่อโทรหา Func และพารามิเตอร์ผ่านและไม่สามารถตอบสนองความต้องการได้
ดังนั้นเราจะได้รับรายการพารามิเตอร์โดยการประมวลผลสตริงหลังจาก func.toString () ได้หรือไม่?
ลองกันเถอะ:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น getfuncparams (func) {
การจับคู่ var = func.toString (). การจับคู่ (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (ตรงกับ && matches.length> 1)
คืนค่าการแข่งขัน [1]. แทนที่ (// s*/, '') .split (',');
กลับ [];
-
ที่นี่เราได้รับอาร์เรย์รายการพารามิเตอร์ func
2. ค้นหาการพึ่งพาตามรายการพารามิเตอร์:
หลังจากได้รับรายการพารามิเตอร์นั่นคือรายการการพึ่งพาจะได้รับ มันง่ายมากที่จะส่งผ่านการพึ่งพาเป็นพารามิเตอร์
การคัดลอกรหัสมีดังนี้:
var params = getFuncparams (func);
สำหรับ (var i ใน params) {
params [i] = บริการ [params [i]];
-
3. ผ่านพารามิเตอร์การพึ่งพาและสร้างอินสแตนซ์:
เรารู้ว่า JavaScript มี Func.Constructor ซึ่งมีสองฟังก์ชั่น: การโทร (thisarg, [arg [, arg, [arg, […]]]]) และใช้ (thisarg, args …) และสามารถใช้การดำเนินการ พารามิเตอร์แรกของฟังก์ชั่นการโทรคือตัวชี้นี้และส่วนที่เหลือเป็นรายการพารามิเตอร์ เหมาะสำหรับการใช้งานเมื่อทราบรายการพารามิเตอร์ Func และไม่สามารถตอบสนองความต้องการของฉันได้ มาดูฟังก์ชั่นที่สอง พารามิเตอร์แรกคือตัวชี้นี้และพารามิเตอร์ที่สองคืออาร์เรย์พารามิเตอร์ เมื่อเรียกว่ามันจะกำหนดค่าให้กับรายการพารามิเตอร์ FUNC โดยอัตโนมัติทีละรายการซึ่งตรงกับความต้องการของฉัน
รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น Activitor (func) {
var obj = {};
func.apply (obj, params);
คืน OBJ;
-
ณ จุดนี้เราสามารถสร้างอินสแตนซ์ของ func นี้และผ่านพารามิเตอร์ที่ต้องการโดย func นี้
4. พิมพ์และทดสอบ:
รหัสสมบูรณ์:
การคัดลอกรหัสมีดังนี้:
วาจา
// สมมติว่ามีการกำหนดบริการบางอย่าง
บริการ = {abc: 123, def: 456, ghi: 789},
// รับรายการพารามิเตอร์ของ func (รายการการพึ่งพา)
getFuncParams = function (func) {
การจับคู่ var = func.toString (). การจับคู่ (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (ตรงกับ && matches.length> 1)
คืนค่าการแข่งขัน [1]. แทนที่ (// s+/, '') .split (',');
กลับ [];
-
// การเติมพารามิเตอร์ (การอ้างอิง) ตามรายการพารามิเตอร์ (การอ้างอิง)
setFuncParams = function (params) {
สำหรับ (var i ใน params) {
params [i] = บริการ [params [i]];
-
ส่งคืน params;
-
// activator
ฟังก์ชั่น Activitor (func) {
var obj = {};
func.apply (obj, setfuncparams (getfuncparams (func)));
คืน OBJ;
-
// กำหนดบริการใหม่
บริการฟังก์ชั่น (ABC, GHI) {
this.write = function () {
console.log (ABC);
console.log (ghi);
-
-
// อินสแตนซ์บริการและเรียกวิธีการ
บริการ var = activator (บริการ);
Service.write ();
คอนโซลถูกพิมพ์สำเร็จ!