تنفيذ جافا سكريبت الوراثةالمشكلة التي تريد تطبيق "الوراثة" في جافا سكريبت. نظرية لغات البرمجة مثل جافا وجيم # يكون لدينا مفهوم البرمجة دعا الوراثة. والفكرة من وراء الوراثة هو رمز للكتابة في مثل هذه الطريقة أن المعرف هو الذي يعرف بأنه نوع العامة التي يتم التلاعب في فئة أو الأسلوب. على سبيل المثال ، فإن البرمجية التالية تكون فئة عامة سواء في جاوة أو جيم # : فئة حاوية فئة حاوية معلمة عامة ، ونوع ، والتي يمكن الإشارة من أي نوع آخر. وكذلك في إعلان الحاويات ، و_managed عضو البيانات هو نفس النوع كمعلمة عامة. في فكرة مجردة ، الحاويات ويدير أي نوع. مبرمج جافا سكريبت قد ننظر في مدونة والتفكير ، "يا ولدي هذا بالفعل في جافا سكريبت!" هنا هو رمز نفسه ، وهذه المرة في جافا سكريبت : وظيفة الحاويات () (this._managed = / * أي نوع * /) كما هو موضح في وصفة 2-8 ، هل يمكن أن يكون إشارة ومقرها بطة في الكتابة أو على أساس القيمة بكتابة بطة. تنفيذ "الوراثة" هو مثل جافا سكريبت لتنفيذ قبل المعالج ، وبالتالي نحن نريد على أساس القيمة بكتابة بطة. رمز المثال التالي يوضح ما يمكن ان تتعرض له عند مزيج قيمة ومرجعية بطة الكتابة معا : الوكيل : وظيفة (مثلا ، funcIdentifier ، newFunc) (اذا (! سبيل المثال [funcIdentifier]) (رمي خطأ جديدا ( "لا يمكن الوكيل الأسلوب غير موجود (" funcIdentifier + + ")")؛) حدة التقييم (" فار generatedOrigFunc = "+ المثال [ funcIdentifier]. toString ()) ؛ وحدة التقييم ( "فار generatedProxyFunc =" + newFunc.toString ()) ؛مثلا [funcIdentifier] = الدالة () ( origFunc فار = generatedOrigFunc ؛ proxyFunc فار = generatedProxyFunc ؛فار = صفيف وسائط جديدة () ؛ ل (فار c1 = 0 ؛ c1 <arguments.length ؛ c1 + +) (args.push (الحجج [c1]) ؛) args.push (origFunc) ؛ args.push (الحجج) ؛ proxyFunc.apply (هذا ، وسائط) ؛)) ، هذا الكود هو مثال على كيفية ليس لكتابة وكيل نمط التنفيذ. المشكلة في التنفيذ هو موضح في رمز جريئة. في بداية رمز جريئة هي بيانين حدة التقييم ، التي تولد قيم المتغيرات generatedOrigFunc وgeneratedProxyFunc. على سبيل المثال جزءا لا يتجزأ من وظيفة [funcIdentifier] ، والمتغيرات يتم الرجوع إليها ، وبسبب الإغلاق ، والمتغيرات origFunc وproxyFunc سوف مرجع المتغيرات الصحيح. إن مفهوم نمط وكيل هو أنه عندما يتم استدعاء الأسلوب ، فإنه يستدعي الدالة الأولى المشار إليها من proxyFunc ، ثم الذي يستدعي الدالة المشار إليها بواسطة origFunc. لأن proxyFunc يسمى الأولى ، فإنه لديه القدرة على preprocess أو postprocess البيانات.
رمز كما هو مكتوب سوف تعمل مع طلب واحد ونمط وكيل ، لكنها ستفشل إذا كان نمط الوكيل يطبق عدة مرات. على سبيل المثال ، تخيل إنشاء رمز التضمين من نمط وكيل المطبقة بالفعل على نمط وكيل. هذا الرمز هو مثال على "مفخخ" قطعة من التعليمات البرمجية في جافا سكريبت. النظر عن كثب في الإعلانات من المتغيرات generatedOrigFunc وgeneratedProxyFunc فما هي هذه المراجع؟ لفهم خطأ ، واعتقد من رمز الوكيل على اليسار وتنفيذ الوكيل 1 (pi1) ورمز على الحق في تنفيذ الوكيل 2 (pi2). إذا كان المستدعي العامة للاتصال pi1 ، التسلسل التالي للأحداث ستجري : 1. pi1 يسمى. 2. pi1 في proxyFunc يسمى. 3. pi1 في origFunc يسمى ، وهو pi2. 4. pi2 في proxyFunc يسمى ، وهو pi1 في proxyFunc. 5. pi1 في proxyFunc يسمى ، داعيا pi1 في origFunc. وعقب هذه الخطوات ، ستلاحظ أن تجري الإعادة. العودية هو بسبب الطريقة المتغيرات generatedOrigFunc وgeneratedProxyFunc يتم الإعلان عنها ، وهذه المتغيرات هي المعلنة دون أي نطاق ولأن الوكيل نطاق الوظيفة amix استخدام الإشارات مع رمز وحدة التقييم. هذا هو ممارسة سيئة ، وذلك لأن بعض المتغيرات سيكون تسلسل وغيرهم لن. نريد حلا قبل المعالج مثل جيم ، حيث "الوراثة" تمثل البدنية استبدال معرف مع نوع المرجوة. نحن لا نريد نظاما templating. وهناك نظام templating سيكون على النحو التالي : <٪ ل(عد فار = 0 ؛ العد <10 ؛ العد + +) (٪> سلسلة [<٪ = العد ٪>] = GenSeries (<٪ = العد ٪>) <٪}٪> ليس هذا ما نريده ، لأن القراءة رمز تراجعا حادا ، وبشكل عام فإنه ليس من الضروري. جافا سكريبت هي عملية ديناميكية رمز اللغة ، والعديد من التركيبات templating يمكن تنفيذها في رمز. انها أكثر صعوبة لتنفيذ تغيير متغير من استخدام إشارات إلى استخدام قيم. الحل ولأغراض التوضيح ، دعونا تبسيط نمط وكيل لأسلوب واحد مع مكالمة واحدة الأسلوب ، على النحو التالي. المصدر : / الانترنت / الجذر / ajaxrecipes / جافا سكريبت / generics.html الدالة EmbeddedReplace () (فار ظائفه = __toCall ؛ معلومات ( "استبدال" ، "مرحبا") ؛ ظائفه () ؛) وظيفة EmbeddedReplace أعلنت متغير المحلية وظائفه. المراجع المحلية ظائفه متغير متغير __toCall. بعد إعلان ظائفه هو دعوة إلى وظيفة من المعلومات. استدعاء دالة آخر هو ظائفه ، وهي وظيفة الدعوة إلى __toCall. من يبحث فقط في استخدام __toCall ، كنت لا أعرف الكثير عن الإعلان غير أنه من المتغيرات العالمية ، وللاطلاع على نطاق هذه الوصفة ، __toCall هو المعرف الذي سيحل محله. وجافا سكريبت توسيع الدعوة سيكون على النحو التالي (أنا مناقشة التفاصيل قريبا) : EmbeddedReplace = Generics.expand (EmbeddedReplace ، (__toCall : الدالة () (معلومات ( "محل في استبدال" ، "مرحبا")؛}})؛ EmbeddedReplace () ؛ الأسلوب Generics.expand معلمتين. المعلمة الأولى هي وظيفة EmbeddedReplace ، والذي سيكون تنفيذه تعديل. المعلمة الثانية هي بنية الكائن الذي يمثل ما معرفات سيتم استبدالها. هيكل كائن يعرف ان هذه الخاصية معرف يحدد هوية لتحل محلها ، والقيمة المقترنة الخاصية هي قيمة استبدالها.نلاحظ كافة التعليمات البرمجية المعروضة هنا يستخدم تقنيات البرمجة جافا سكريبت القياسية. أنت لا تحتاج إلى استخدام مخازن خاصة أو العلامات التي تخلط بين المحررين ، وجعلها أكثر تعقيدا من أجل بناء موثوق بها ، للصيانة. الأسلوب Generics.expand عند الانتهاء من تنفيذ ، في أعقاب إعلان وظيفة يتم إنشاؤها : GeneratedEmbeddedReplace الدالة () (فار ظائفه = (وظيفة)) (معلومات ( "محل في استبدال" ، "مرحبا") ؛)) ؛ معلومات ( "استبدال" ، "مرحبا") ؛ ظائفه () ؛) والعازلة ولدت هذا ما نتوقعه ، والسلوك هو ما نتوقعه. عندما يتم استدعاء GeneratedEmbeddedReplace ، جزءا لا يتجزأ من وظيفة تسمى. من أجل المقارنة ، دعونا ننظر كيف يمكن أن يكون بدون عمل توسيع وظيفة المضمنة : __toCall الدالة () (معلومات ( "محل في استبدال" ، "مرحبا") ؛) ؛ EmbeddedReplace الدالة () (فار ظائفه = __toCall ؛ معلومات ( "استبدال" ، "مرحبا") ؛ ظائفه () ؛) GeneratedEmbeddedReplace سوف يدعو لاستدعاء الدالة __toCall والتصرف ، والبحث ، وأشعر بأن على سبيل المثال الموسعة. ولكن لماذا يجب ان تفعل هذا؟ الإشارة المستندة إلى التوسع ليس التوسع على الإطلاق. لديك ببساطة خلق عالمي متغير (__toCall) التي يمكن تعيينها في وقت التشغيل. مع قيمة التوسع النوع ، يمكنك الحصول على وظائف متعددة مع مختلف الوظائف التي لا تتعارض مع بعضها البعض ، ولأن السلوك يتحدد الاحالة ، يمكنك تشغيل في الحالة المبينة في وصفة 2-14 ، حيث يجري تقاسم المهام. إذا المهام المشتركة ، ثم الصراع يمكن أن تنشأ إذا كانت وظيفة من وظيفة يتم تبديل. أو هل يمكن أن يكون الحالة التي تكون فيها وظيفة لا شيء واحد مرة واحدة ، وشيء آخر مرة أخرى. لتوضيح "نفعل شيئا واحدا الآن ، ولكن ليس في وقت لاحق" المشكلة ، والنظر في السيناريو التالي رمز : __toCall الدالة () (معلومات ( "محل في استبدال" ، "مرحبا") ؛) ؛ EmbeddedReplace الدالة () (معلومات ( "استبدال" ، "مرحبا") ؛ __toCall () ؛) الدالة المتصل () (EmbeddedReplace () ؛ __toCall = الدالة () () EmbeddedReplace () ؛) عندما يتم استدعاء الشخص المتصل ، الدعوة الأولى لEmbeddedReplace النتائج في بعض الانتاج. ثم __toCall هو تكليف ، والدعوة مرة أخرى EmbeddedReplace النتائج في الإخراج الأخرى التي يتم توليدها. ربما هذا هو التأثير المطلوب ، ولكن غالب الظن انها ليست كذلك. طريقة واحدة لحل المشكلة هو لتقييد استخدام القدرات الديناميكية للجافا سكريبت. ومع ذلك ، عند هذه النقطة أود أن أسأل ، لماذا أنت باستخدام جافا سكريبت واياكس؟ رأيي هو أن جافا سكريبت واياكس تمثل تطورا في مجال البرمجة ، وبالتالي يجب استخدام قدراتها السلوك الديناميكي. EmbeddedReplace قد تم توسيعها ، ثم تعديل __toCall لم تكن لدي أي تأثير على EmbeddedReplace. وهذا هو ما تحتاج إلى أخذها في الاعتبار عند كتابة شفرة جافا سكريبت ، وأحيانا كنت سوف تستخدم الإشارات ، وأحيانا كنت ستستخدم التوسعات مثل تلك التي اقترحها الوراثة جافا سكريبت ، وأود أن أضيف نقطة واحدة. ليس كقاعدة عامة ، ولكن فكرة أن في سياقات محددة يمكن أن يكون لها مكانها. تخيل كتابة تطبيق حيث دفع مبلغ يحسب على أساس سعر الفائدة اليومي الحالي. في معظم لغات البرمجة ، فإن الفائدة الحالي الدفع يكون متغير من شأنه أن يمكن تحميل وكلف في وقت التشغيل. الجنيسة باستخدام جافا سكريبت والسلوك القائم على رمز ، يمكن استخدام التعليمات البرمجية التالية موسعة تكون : وظيفة CalculateInterestPayment (المبلغ) (عودة مبلغ * 0.04 ؛) هذا الرمز هو ما لغات البرمجة الأخرى الكلمة الثابت ترميز. انها تعتبر ضمني ، لأن رقم 0.04 هو تجميعها في التطبيق والتي لا يمكن تغييرها. ولكن هنا هو الاستفادة من السلوك القائم على رمز : باستخدام جافا سكريبت الوراثة ، قيمة الثابت ترميز تافهة للتغيير ، والحفاظ على النموذج التقليدي البرمجة عندما كنت لا تحتاج للا تقدم أي معنى على الإطلاق. يمكنك استخدام الثابت ترميز البرمجة الاستراتيجية عندما تكون البيانات قراءة في معظمها، أو عندما تتم قراءة بيانات أكثر مما هو مكتوب. الحصول على بيانات مضمنة يمكن أن يكون الحصول على الأداء ، وتقديم المزيد من المرونة ، وتبسيط الخوارزمية. الجنيسة باستخدام جافا سكريبت اليوم ، على حساب الفائدة هو عدد بسيط ، ولكن غدا الحساب يمكن أن تكون عملية حسابية المجمع الذي يستخدم كقاعدة ينزلق على أساس كمية التي يتم معالجتها. وقد شرحت لماذا ، وكيف ، ومتى جافا سكريبت "الوراثة" أنا الآن كيفية تغطية جافا سكريبت "الوراثة" يتم تنفيذها. انها عملية بسيطة للغاية أن يتضمن البحث والاستعاضة معرف في منطقة عازلة. التنفيذ الكامل هو كما يلي. المصدر : / الانترنت / الجذر / مخطوطات / Common.js الوراثة فار = (توسيع : وظيفة (toProcess ، itemsToInject) (bufferToProcess فار = ops.singleSerialize (toProcess) ؛ ل(itemToReplace في itemsToInject) (recurFind فار = وظيفة (startIndex) (فار الإزاحة = bufferToProcess.indexOf (itemToReplace ، startIndex) ، وإذا كان (يقابل == -1) (العودة ؛) اليسار فار = bufferToProcess.slice (0 ، ويقابل) ؛ الحق فار = bufferToProcess.slice (موازنة + itemToReplace.length) ؛ منتصف فار = ops.simpleSerialize (itemsToInject [itemToReplace]) ؛ bufferToProcess = يسار الوسط + + الحق ؛ الإزاحة + + ؛ recurFind (الإزاحة) ؛) recurFind (0) ؛) genBuffer فار = "cls فار =" bufferToProcess + + "؛" ؛ وحدة التقييم (genBuffer) ؛ cls العودة ؛)) لتوسيع كائن جافا سكريبت ، والكائن قد يكون أول لتحويلها إلى منطقة عازلة. وops.singleSerialize الطريقة بتحويل أي كائن جافا سكريبت في منطقة عازلة ، و في حالة المثال السابق ، كان تحويل المعلمة toProcess في منطقة عازلة. بعد تحويلها إلى منطقة عازلة ، في عملية ايجاد هوية والاستعاضة عنها باستخدام حلقة يتم تشغيلها. مع كل تكرار للحلقة المخزنة في المتغير itemToReplace هو معرف في لتحل محل bufferToProcess. وفي حلقة ، والإشارات الدالة على recurToFind المتغير الذي يسمى بشكل متكرر. والغرض من هذه الإعادة هي تدريجيا الى البحث المخزن المؤقت لمعرف ليحل محل. نلاحظ العودية استراتيجية تتناول في وصفة 2-6. العثور على معرف داخل bufferToProcess ، ويتم استخدام أسلوب indexOf. indexOf معلمتين : المعلمة الأولى هو معرف للعثور على والمعلمة الثانية هو مؤشر لبدء البحث. indexOf إذا لم يعثر على معرف ، ثم القيمة -1 عاد وتوقف عن الإعادة. إذا indexOf يرى المعرف فإن الرقم القياسي من حيث المعرف يبدأ يتم إرجاعها. بعد أن وجدت المعرف ، وعازلة ينقسم إلى جزء وترك جزء الحق. الأجزاء اليمين واليسار هي مجتمعة مع النص لتحل محلها ، وbufferToProcess جديدة يتم إنشاؤها ، وعندما لم يتم العثور على التعريف ، وتعتبر عازلة موسعة. الخطوة الأخيرة المتبقية هي لتحويل العازلة إلى مثيل كائن. تحويل العازلة مشكلة لأن المنفذة للعودة وحدة التقييم (bufferToProcess) الأمر قد يؤدي إلى سيناريوهات غير متوقعة. لإجراء التحويل يمكن التنبؤ به ، bufferToProcess متصلا مع الإحالة إلى المتغير cls. ثم عندما عازلة جديدة يتم تنفيذها باستخدام عبارة وحدة التقييم وcls المحلية متغير مثيل ، وأنها يمكن أن تعاد إلى الطالب. رمز لتوسيع وتنفيذ جافا سكريبت "الوراثة" هو سهل نسبيا ، ولكن آثار عميقة. عند استخدام الأدوية "جافا" ، الإبقاء على النقاط التالية في الاعتبار : • جافا سكريبت مراجع لسهولة تطبيقها و، في كثير من الحالات ، جيدة بما فيه الكفاية. لكن ، وكما أشير في وصفة 2-14 ، إشارات لا تشكل "مفخخ" المشكلة. • لديك لاتخاذ قرار بين استخدام مراجع في كل شيء ، واستخدام وحدة التقييم على كل شيء. "كل شيء" هنا لا تشير إلى تطبيق كامل ، ولكن كل شيء في نطاق من نوع أو وظيفة. لا تخلط المراجع مع بيان وحدة التقييم ؛ يفعل ذلك سوف يسبب مشاكل. • وعموما ، الشفرة هو أكثر قوة واستقرارا إذا كنت تستخدم وحدة التقييم مثل تقنيات. مراجع العمل لحالات بسيطة ، ولكن إذا كان لديك رمز رمز يضمن مرات عدة ، ثم أخطاء يمكن أن تؤدي. • والمراجع ، كنت عرضة لخطر أن أجزاء متعددة من رمز سيتم الرجوع نفس الرمز ونفس المتغيرات. هذا يمكن أن يسبب الفساد و لا ينبغي الاستهانة. • استخدام وحدة التقييم على غرار البيانات يجعل التصحيح أسهل ، لأنه إذا كنت تسلسل وظيفة أو وجوه ، سوف تحصلون على الحالة الراهنة للقانون ، وبالتالي تكون قادرة على متابعة ما هي المشكلة. إذا كنت تستخدم مراجع ، ستحتاج مصحح ، ومع مدونة السلوك التي تحدد لها وقت ، ويمكن تصحيح تكون مملة. • استخدام الأدوية الجنيسة "جافا" كما هو موضح في هذه الوصفة هي صديقة للبيئة تطوير متكاملة لأنك لست إنشاء مخازن من جهة ، وأنت لا كتابة التعليمات البرمجية مع السمات الخاصة التي إديس مثل العاشر تطوير ، فيجوال ستوديو ، كومودو ، ومرئي لا SlickEdit لا أفهم. مقال مقدم من سونيا Lande تنويه :موقعنا على الانترنت ليست مسؤولة عن محتوى هذه المادة. Webarticles هو حر للمعلومات. المهم : هذه المادة "تطبيق جافا سكريبت الوراثة" وقد ترجم من قبل البرمجيات التلقائي. نشعر بالاسف من اجل أي الأخطاء الإملائية التي قد حدث. شكرا لتفهمكم.
|
|||||
| Online: 305 users browsing the articles directory |
|
|