مقدمة
من خلال طرق الاتصال () ، تطبيق () و BIND () ، يمكننا بسهولة استعارة طرق من كائنات أخرى دون أن ترثها من هذه الكائنات.
أساليب الاقتراض في جافا سكريبت
في JavaScript ، يمكن في بعض الأحيان إعادة استخدام وظائف أو طرق الكائنات الأخرى ، وليس بالضرورة محددة على الكائن نفسه أو على النموذج الأولي. من خلال طرق الاتصال () ، تطبيق () و bind () ، يمكننا بسهولة استعارة الأساليب من كائنات أخرى دون أن ترثها. هذه طريقة شائعة يستخدمها مطورو JavaScript المحترفين.
طريقة النموذج الأولي
في JavaScript ، باستثناء أنواع البيانات البدائية غير القابلة للتغيير ، مثل السلسلة والرقم والطلاونة ، فإن جميع البيانات تقريبًا هي كائنات. Array هو كائن مناسب لاجتياز وتحويل التسلسلات المرتبة. يحتوي النموذج الأولي على أساليب سهلة الاستخدام مثل الشريحة والانضمام والدفع والبوب.
مثال شائع هو أنه عندما يكون كلا الكائنين والمصفوفات هياكل بيانات من نوع القائمة ، يمكن للكائنات "استعارة" أساليب المصفوفات. الطريقة الأكثر شيوعًا للاقتراض هي Array.prototype.slice .
وظيفة myfunc () {// error ، الوسيطات هي صفيف مثل كائن ، وليس وسيطات صفيف حقيقية. sort () ؛ // "استعارة" شريحة طريقة الصفيف من النموذج الأولي الخاص به ، والتي تأخذ صفيف مثل كائن (المفتاح: القيمة) // وإرجاع صفيف حقيقي var args = array.prototype.slice.call (الوسائط) ؛ // args أصبحت الآن صفيفًا حقيقيًا ، لذلك يمكن استخدام طريقة Sort () من Array Args.sort () ؛ } myfunc ('Bananas' ، 'cherries' ، 'Apples') ؛تعمل أساليب الاقتراض لأن الأساليب والمكالمة وتطبيقها تسمح بوظائف الاتصال في سياقات مختلفة ، والتي تعد أيضًا طريقة جيدة لإعادة استخدام الوظائف الحالية دون الحاجة إلى ورث كائنات أخرى. في الواقع ، تحدد المصفوفات العديد من الطرق الشائعة في النماذج الأولية ، مثل Join and Filter:
// خذ سلسلة "ABC" وتنتج "a | b | carray.prototype.join.call ('abc' ، '|') ؛ -1 ؛}). الانضمام ('') ؛ يمكن ملاحظة أنه لا يمكن للكائنات فقط استعارة أساليب الصفيف ، ولكن أيضًا الأوتار. ولكن نظرًا لأن الأساليب العامة محددة على النموذج الأولي ، يجب عليك استخدام String.prototype أو Array.prototype في كل مرة تريد فيها استعارة طريقة. الكتابة مثل هذا مطول للغاية وسيصبح قريبًا مزعجًا. طريقة أكثر كفاءة هي استخدام الحرفيات لتحقيق نفس الغرض.
باستخدام طرق الاقتراض الحرفية
الحرفية عبارة عن بنية بناء الجملة تتبع قواعد JavaScript ، يشرحها MDN على هذا النحو:
في JavaScript ، يمكن أن يمثل استخدام الحرفيات القيم. فهي قيم ثابتة ، إما المتغيرات ، أو تُعطى حرفيًا في البرنامج النصي.
يمكن اختصار الحرفيين كنموذج أولي:
[] .slice.call (الحجج) ؛ [].
لا يبدو هذا مطولاً للغاية ، لكن لا يزال من القبيح بعض الشيء العمل مباشرة على [] و "" لاستعارة الطريقة. يمكنك استخدام المتغيرات لحفظ المراجع إلى الحرفيين والأساليب ، مما يجعل الكتابة أسهل:
var slice = [] var touppercase = ''. touppercase ؛ touppercase.call (['' soplase '،' Words '،' ، 'A' ، 'Sectence']). split ('،') ؛مع الإشارات إلى أساليب الاقتراض ، يمكننا بسهولة تسميتها باستخدام Call () ، والتي يمكن أيضًا إعادة استخدام الرمز. التمسك بمبدأ تقليل التكرار ، دعنا نرى ما إذا كان بإمكاننا استعارة الأساليب دون الحاجة إلى كتابة المكالمة () أو تطبيق () في كل مرة ندعو فيها:
var slice = function.prototype.call.bind (array.prototype.slice) ؛ slice (وسيطات) ؛ var join = function.prototype.call.bind (array.prototype.join) ؛ join ('abc' ، '|') ؛ var touppercase = function.prototype.call.bind (string.prototype.touppercase) ؛ touppercase (['sultcase' ، 'Words' ، 'in' ، 'A' ، 'Sectence']). split ('،') ؛ كما ترون ، يمكنك الآن استخدام Function.prototype.call.bind لربط طريقة "المقترض" بشكل ثابت من نماذج أولية مختلفة. ولكن كيف تعمل الجملة var slice = Function.prototype.call.bind(Array.prototype.slice) في الواقع؟
فهم الوظيفة
Function.prototype.call.bind قد تبدو معقدة بعض الشيء للوهلة الأولى ، ولكن قد يكون من المفيد للغاية فهم كيفية عمله.
Function.prototype.call هو مرجع "استدعاء" وظيفة وسيقوم بتعيين قيمة "هذه" للاستخدام في دالة.
لاحظ أن "Bind" إرجاع وظيفة جديدة مع قيمة "هذه". لذلك ، فإن "هذه" الوظيفة الجديدة التي تم إرجاعها بواسطة .bind(Array.prototype.slice) هي دائمًا وظيفة Array.Protype.Slice.
لتلخيص ، تدعو الوظيفة الجديدة وظيفة "الاتصال" ، و "هذا" هي وظيفة "الشريحة". سيشير استدعاء شريحة () إلى الطريقة المؤهلة سابقًا.
طرق لتخصيص الكائنات
الميراث رائع ، لكن المطورين عادة ما يستخدمونه عندما يرغبون في إعادة استخدام بعض الميزات الشائعة بين الكائنات أو الوحدات النمطية. ليست هناك حاجة لاستخدام الميراث فقط لإعادة استخدام التعليمات البرمجية ، لأن طرق الاقتراض البسيطة يمكن أن تكون معقدة في معظم الحالات.
ناقشنا فقط استعارة الأساليب الأصلية من قبل ، ولكن استعارة أي طريقة على ما يرام. على سبيل المثال ، يمكن للرمز التالي حساب درجة اللاعب من لعبة النقاط:
var scorecalculator = {getSum: function (results) {var score = 0 ؛ لـ (var i = 0 ، len = results.length ؛ i <len ؛ i ++) {score = score+results [i] ؛ } درجة العودة ؛ } ، getScore: function () {return scorecalculator.getSum (this.results) / this.handicap ؛ }} ؛ var player1 = {results: [69 ، 50 ، 76] ، Handicap: 8} ؛ var player2 = {النتائج: [23 ، 4 ، 58] ، عائق: 5} ؛ var score = function.prototype.call.bind (scorecalculator.getScore) ؛ // SCORE: 24.375Console.log ('Score:' + Score (player1)) ؛ // SCORE: 17Console.log ('Score:' + Score (player2)) ؛على الرغم من أن المثال أعلاه صريح للغاية ، إلا أنه يمكن ملاحظة أنه تمامًا مثل الطرق الأصلية ، يمكن استعارة الطرق المعرفة من قبل المستخدم بسهولة.
لخص
يمكن أن يغير الاتصال والربط والتطبيق طريقة استدعاء وظائف وغالبًا ما يتم استخدامها عند وظائف الاقتراض. معظم المطورين على دراية باقتراض الأساليب الأصلية ، ولكن نادراً ما يقترضون أساليب مخصصة.
في السنوات الأخيرة ، تطورت البرمجة الوظيفية لـ JavaScript بشكل جيد. كيفية استخدام function.prototype.call.bind لاستعارة الطريقة أكثر ملاءمة؟ تشير التقديرات إلى أن مثل هذه الموضوعات ستصبح أكثر شيوعًا.
ما سبق هو ملخص أساليب الاقتراض في جافا سكريبت. آمل أن يكون من المفيد للجميع فهم أساليب الاقتراض في جافا سكريبت.