في الوقت الحاضر ، فإن جميع الأطر هي معيارية ، وحتى JavaScript الواجهة ليست استثناء. كل وحدة مسؤولة عن وظائف معينة ، وهناك ترابط بين الوحدات النمطية. إذن السؤال هو: كيفية تنفيذ حقن التبعية في جافا سكريبت؟ (حقن تبعية JavaScript ، الأطر الرئيسية لها تطبيقات مقابلة ، يتم تعلم أفكار التنفيذ فقط هنا)
المتطلبات التالية:
افترض أن هناك بالفعل مجموعة من قيمة مفاتيح وحدة الخدمة المحددة ، فونك هي خدمة جديدة إضافية ، وقائمة المعلمات هي تبعية الخدمة.
نسخة الكود كما يلي:
var services = {abc: 123 ، def: 456 ، ghi: 789} ؛ // افترض أن بعض الخدمات محددة
خدمة الوظائف (ABC ، GHI) {
this.write = function () {
console.log (ABC) ؛
console.log (GHI) ؛
}
}
Activitor (Func) {func) {
var obj ؛
// ينجز
إرجاع OBJ ؛
}
حل:
من خلال بعض الآليات (الانعكاس؟) ، أخرج قائمة المعلمات المحددة بواسطة FUNC وتعيين القيم واحدة تلو الأخرى. ثم ، من خلال بعض الآلية (Active؟) ، يتم إنشاء مثيل له.
حل:
1. احصل على قائمة المعلمات من Func:
كيف تحصل على قائمة المعلمات؟ أول ما يتبادر إلى الذهن هو آلية الانعكاس. فهل هناك أي انعكاس في جافا سكريبت؟ يجب أن يكون هناك. أنا أعرف فقط كيفية استخدام وظيفة eval (STR) في الوقت الحالي ، ولكن يبدو أنه لا يوجد تنفيذ ذي صلة للحصول على قائمة المعلمات. دعونا نلقي نظرة على تعريف func.arguments. هذه الخاصية صالحة فقط عند استدعاء FUNC وتمرير المعلمات ، ولا يمكن تلبية الاحتياجات.
هل يمكننا الحصول على قائمة المعلمات من خلال معالجة السلسلة بعد func.toString ()؟
لنجربها:
نسخة الكود كما يلي:
وظيفة getFuncparams (func) {
var matches = func.toString (). match (/^function/s*[^/(]*/(/s*([^/)]*)/)/m) ؛
if (Matches && matches.length> 1)
مباريات الإرجاع [1] .replace (// s*/، '') .split ('،') ؛
يعود []؛
} ؛
هنا نحصل على صفيف قائمة معلمة FUNC.
2. ابحث عن التبعيات بناءً على قائمة المعلمات:
بعد الحصول على قائمة المعلمات ، أي ، يتم الحصول على قائمة التبعية. من السهل جدًا تمرير الاعتماد عليها كمعلمة.
نسخة الكود كما يلي:
var params = getFuncparams (func) ؛
لـ (var i in parms) {
params [i] = services [params [i]] ؛
}
3. تمرير معلمات التبعية وتثبيتها:
نحن نعلم أن JavaScript لديها func.constructor ، التي لها وظيفتين: call (thisarg ، [arg [، arg ، [arg ، [...]]]) وتطبيق (thisarg ، args ...) ويمكنها تنفيذ عمليات Func للتثبيت. المعلمة الأولى لوظيفة الاتصال هي هذا المؤشر ، والباقي هو قائمة المعلمات. هذا مناسب للاستخدام عندما تكون قائمة معلمات FUNC معروفة ولا يمكن تلبية احتياجاتي. دعونا نلقي نظرة على وظيفة التطبيق الثانية. المعلمة الأولى هي أيضا هذا المؤشر ، والمعلمة الثانية هي صفيف المعلمة. عند استدعاءها ، سيتم تعيين القيم تلقائيًا إلى قائمة معلمة FUNC واحدة تلو الأخرى ، والتي تلبي احتياجاتي فقط.
الرمز تقريبًا على النحو التالي:
نسخة الكود كما يلي:
Activitor (Func) {func) {
var obj = {} ؛
func.apply (obj ، params) ؛
إرجاع OBJ ؛
}
في هذه المرحلة ، يمكننا إنشاء مثيل لهذا FUNC ونمر المعلمات المطلوبة من قبل هذا FUNC.
4. طباعة واختباره:
رمز كامل:
نسخة الكود كما يلي:
var
// افترض أن بعض الخدمات محددة
الخدمات = {ABC: 123 ، DEF: 456 ، GHI: 789} ،
// احصل على قائمة المعلمات لـ FUNC (قائمة التبعية)
getFuncparams = function (func) {
var matches = func.toString (). match (/^function/s*[^/(]*/(/s*([^/)]*)/)/m) ؛
if (Matches && matches.length> 1)
مباريات الإرجاع [1] .replace (// s+/، '') .split ('،') ؛
يعود []؛
} ،
// معلمات التعبئة (التبعيات) وفقًا لقائمة المعلمات (التبعيات)
setfuncparams = function (params) {
لـ (var i in parms) {
params [i] = services [params [i]] ؛
}
إرجاع المعلمة ؛
} ؛
// المنشط
Activitor (Func) {func) {
var obj = {} ؛
func.apply (OBJ ، setFuncparams (getFuncparams (func))) ؛
إرجاع OBJ ؛
}
// تحديد خدمة جديدة
خدمة الوظائف (ABC ، GHI) {
this.write = function () {
console.log (ABC) ؛
console.log (GHI) ؛
}
}
// إنشاء الخدمة واتصل بالطريقة
var service = Activator (service) ؛
service.write () ؛
تمت طباعة وحدة التحكم بنجاح!