تنفيذ Mixins في جافا سكريبت

المشكلة تحتاج إلى تنفيذ روبي - mixins النمط في جافا سكريبت لتوسيع وظائف الجسم بسهولة. نظرية وروبي ، mixins هي وسيلة لتوسيع نطاق وظائف لكائن من خلال اعتماد وظائف لكائن آخر. عند إنشاء مثيل من نوع جافا سكريبت ، والأساليب والخصائص المرتبطة نوع يعتمد على نوع من الإعلان. لتوسيع وظائف مثيل ، يتم تعيين خاصية مع وظيفة أو كائن آخر.

 المصدر : / الانترنت / الجذر / مقالات اياكس / جافا سكريبت / DefinedClass الدالة mixins.html () () DefinedClass.prototype.defined1 = الدالة () () DefinedClass.prototype.defined2 = الدالة () ()
  

وظيفة DefinedClass يستخدم لتحديد نوع. طريقتين ، defined1 وdefined2 ، المقترنة نوع DefinedClass. كل أسلوب يرتبط الملكية النموذج ، وذلك في كل مرة DefinedClass مثيل ، وهذه الأساليب يشتركان فى نفس وظيفة المثال. وبالتالي ، إذا قمت بتعيين خاصية defined1 أو defined2 ، ثم في جميع حالات DefinedClass سوف تكون قادرة على مشاركة نفس الممتلكات سبيل المثال. الحل لتوسيع مثيل DefinedClass ، هل يمكن تعيين خصائص فردية مثيل. فردي نسخ خاصية مملة ؛ حلا أكثر فعالية هي نسخة واحدة من خصائص الكائن إلى كائن آخر. أطر كثيرة ، مثل نموذج الدوجو والأدوات ، وتوفير القدرة على نسخ خصائص. التالي هو نموذج أولي لتنفيذ mixin.

 المصدر : / الانترنت / الجذر / النموذج / شعبة نظم / prototype.js Object.extend = وظيفة (الوجهة والمصدر) (ل(الملكية في المصدر) (الوجهة [الملكية] = مصدر [الملكية] ؛) عودة المقصد ؛

وظيفة Object.extend معلمتين : المنشأ والمقصد. المعلمة كائن يمثل الوجهة التي سيكون لها الخصائص المضافة. المعلمة مصدر يمثل الكائن الذي سيكون له خصائصه نسخها. خصائص يتم نسخها باستخدام لحلقة لأنه ليس من الممكن أعاد خصائص الكائن مثيل في أي طريقة أخرى. المعرف الممتلكات ، وليس من قيمة العقار ، هو يتحرك. لاسترداد قيمة الممتلكات ، هل يمكن استخدام بناء الجملة التالي : source.property المشكلة مع هذا التدوين هو أن يتم تعريف الخاصية بشكل صريح ، واستخدامها في سياق تنفيذ وظيفة mixin معقد. الحل هو استخدام جافا سكريبت مجموعة الرموز واسترداد الممتلكات كصفيف. العودة الى نموذج الحل ، حيث أن كل الممتلكات للمصدر هو يتحرك ، يتم استرداد القيمة والمخصصة لبلدان المقصد. دعونا تنطبق على تمديد استخدام الأسلوب التالي اعلان مثيل كائن.

 المصدر : / الانترنت / الجذر / مقالات اياكس / جافا سكريبت / MyExtensions mixins.html = (اختبار : وظيفة (tstValue) (assertEquals (tstValue ، MyExtensions.test.value) ؛))

وMyExtensions الطبقة الإعلان هو مرجع ثابت إلى واحد جزءا لا يتجزأ من الممتلكات التي لا مثيل لنوع الكائن. نحن نريد لنسخ الملكية إلى مثيل DefinedClass ، كما هو مبين في الاختبار التالي.

 المصدر : / الانترنت / الجذر / مقالات اياكس / جافا سكريبت / prototype_mixin mixins.html : الدالة () (cls فار = DefinedClass الجديدة () ؛ إذا (MyExtensions.test.value) (testManager.failed () ؛) Object.extend (cls ، MyExtensions (؛) cls.test.value = 3 ؛ cls.test (3) ؛ cls.test.value = 10 ؛ cls.test (10) ؛) ،

رمز الاختبار يتجاوز مجرد الدعوة Object.extend ، بل تكشف أيضا أن معظم أدوات تنفيذ mixins باستخدام أنواع البط استنادا إلى المراجع. ليس من الخطأ ، ولكن لأن وظائف هي الأشياء التي سيتم تبادلها بين أنواع متعددة من الدرجة. ولكي نفهم هذا ، أن ننظر في تنفيذ MyExtensions.test. تنفيذ الإشارات الدالة على test.value الممتلكات وإشارات مرجعية فإنه مع المعلمة tstValue. في تنفيذ الدالة prototype_mixin ، مثيل DefinedClass يتم إنشاؤه ثم مددت مع أساليب MyExtensions. الخاصية cls.test.value يتم تعيين قيمة 3 ، وتسمى طريقة اختبار.

تنفيذ اختبار والتحقق من قيمة MyExtensions.test.value النحو 3. إذا كان الأسلوب اختبار cls كانت نسخة من أسلوب MyExtension.test ، ثم اختبار من شأنه أن يفشل بسبب MyExtensions.test.value لم يتم تعيين ، كما يدل على ذلك إذا كانت كتلة الاختبار. لكن رمز الاختبار لا تفشل ، مما يدل على أن cls.test وMyExtensions.test هي واحدة ونفس الأسلوب. المشار إليه على أساس بطة الكتابة لديه بعض السلوكيات الفردية ، واحدة منها هو موضح في التعليمات البرمجية التالية.

 المصدر : / الانترنت / الجذر / مقالات اياكس / جافا سكريبت / mixins.html الدالة GetExtensionFunctionality () ((عودة اختبار : وظيفة (tstValue) (assertEquals (tstValue ، this.test.value) ؛))) prototype_inconsistent_mixin : الدالة () (فار cls1 = DefinedClass الجديدة () ؛ فار CLS2 = DefinedClass الجديدة () ؛ Object.extend (cls1 ، GetExtensionFunctionality ()) ؛ Object.extend (CLS2 ، GetExtensionFunctionality ()) ؛ cls1.test.value = 3 ؛ محاولة (cls2.test (3 ) ؛) الصيد (ه) (اذا (e.jsUnitMessage) (معلومات ( "prototype_inconsistent_mixin" ، "استثناء المتوقعة (" e.jsUnitMessage + + ")")؛))) ،

هنا ، في وظائف الموسعة يتم تعريفها في سياق استدعاء أسلوب. في المثال السابق ، وكان يشارك في طريقة الاختبار من قبل فئات متعددة. في الاختبار ، cls1 وCLS2 ينبغي أيضا أن تشترك في نفس طريقة الاختبار. يستخدم رمز الاختبار سيؤدي إلى استثناء المتوقع cls.test.value تفيد بأن ليس لديه قيمة 3. وباختصار ، فإن المشكلة تكمن في أن يكون لديك طريقتان لاستدعاء Object.extend ، وتحصل على اثنين من مختلف تماما بسبب السلوكيات لطبيعة وقيمة مرجعية ومقرها بكتابة بطة. وهذا شيء لا تحتاج إلى أن يكون على علم ، لأنك قد تحصل على بعض السلوك الغريب. بطبيعة الحال ، يمكن أن يكون حجة مضادة إذا كنت تفكر في طبيعة الملكية النموذج ، نفس النوع من السلوك النتائج. وأنا أتفق هذا هو الحال ولكن أيضا أن ندرك أن هذه الأمثلة لم استخدام المعرف النموذج. مطور جافا سكريبت يعلم ما هي تداعيات النموذج ، وبالتالي لن تعرف متى تستخدم ومتى لا لاستخدام الكلمة. في هذه المقالة من الأمثلة ، وقد تجلى في سلوك النموذج الأولي من دون استخدام النموذج ، ونحن نعرف عن هذا الوضع ، وهناك طريقتين mixin : أحدهما أن نسخ المراجع (المرجع بطة كتابة) واحد أن يفعل نسخة كاملة (القيمة بكتابة بطة). القيمة الكاملة المستندة إلى بطة - كتبته تنفيذ mixin التالي.

 المصدر : / الانترنت / الجذر / مخطوطات / jaxson / Common.js mixin : وظيفة (copyTo ، copyFrom ، forceCopy) ( copiedFrom فار = وحدة التقييم (ops.singleSerialize (copyFrom)) ؛ل(الملكية في copyFrom) (اذا ((copyTo [الملكية] & & القوة) | |! copyTo الخاصية []) (copyTo [الملكية] = copiedFrom [خاصية] ؛)))

في تنفيذ الأسلوب mixin ، فإن الخطوة الأولى هي لتوليد العازلة من سبيل المثال ليتم نسخها (ops.singleSerialize) ، ومن ثم تنفيذ العازلة باستخدام وحدة التقييم. عملية توليد العازلة ومن ثم المنفذة لها تأثير الاستنساخ على الكائن وخصائصه. ثم عندما يتم استنساخ يتحرك ، وجوه لمدد قد تضمن إشارات إلى كائن مستنسخ ، وليس الكائن الأصلي. يستوفي هذا الشرط أن يعترض على أن تمتد لنسخ خصائص الكائن المصدر.

في المقال شفرة المصدر ، كما ستجد طريقة تسمى ops.refMixin ، التي تتصرف مثل mixin في تطبيقات أخرى ويعين مراجع إلى الكائن أن تمدد. عند تنفيذ mixins ، والحفاظ على النقاط التالية في الاعتبار :

• Mixins هي وسيلة لتوسيع نطاق وظائف لكائن من خلال اعتماد وظائف لكائن آخر. في جافا سكريبت ، يمكنك تكرار هذه التقنية عن طريق نسخ المراجع أو من خلال نسخ وظيفة مباشرة.

• Mixins هي شكل من أشكال النموذج القائم على البرمجة حيث سلوك الكائن يتم تحديد وقت.

• لا يجوز لك الكتابة الخصائص التي هي جزء من المهام ، وبالتالي أعتقد أن النسخ المرجعية ليست مشكلة. ولكن يكون على علم مسبق : لو كان لديك كائن مصدر إشارات الخصائص التي كائنات مرجعية ، ثم لا يتم نسخ الكائن ، وإنما الإشارة إلى الكائن.

• سوف تستخدم على نطاق واسع mixins عند كتابة شفرة جافا سكريبت ، لذا كن حذرا مع الكائنات الخاصة بك والمراجع.

مقال مقدم من سونيا Lande


تنويه :موقعنا على الانترنت ليست مسؤولة عن محتوى هذه المادة. Webarticles هو حر للمعلومات.
المهم : هذه المادة "تنفيذ Mixins في جافا سكريبت" وقد ترجم من قبل البرمجيات التلقائي. نشعر بالاسف من اجل أي الأخطاء الإملائية التي قد حدث. شكرا لتفهمكم.


Online: 285 users browsing the articles directory