[actionscript] كيفية التحقق مما إذا كان كائنان من نفس النوع في أكتيونسكريبت؟



Answers

يحتوي أكتيونسكريبت 3 على عامل تشغيل يمكن استخدامه لمقارنة الكائنات. النظر في التعليمات البرمجية التالية:

var mySprite:Sprite = new Sprite();
var myMovie:MovieClip = new MovieClip();

trace(mySprite is Sprite);
trace(myMovie is MovieClip);
trace(mySprite is MovieClip);
trace(myMovie is Sprite);

والتي سوف تنتج الإخراج التالي:

true
true
false
false

هذا سوف يعمل لفئات المدمج في، والطبقات التي تخلق نفسك. المعادل 2 أكتيونسكريبت من هو المشغل هو مثيل .

Question

أريد القيام بذلك في أكتيونسكريبت:

typeof(control1) != typeof(control2)

لاختبار ما إذا كان كائنين من نفس النوع. هذا من شأنه أن يعمل على ما يرام في C #، ولكن في أكتيونسكريبت أنه لا. في الواقع فإنه يعود 'object' لكل من typeof() تعبيرات لأن هذه الطريقة يعمل أكتيونسكريبت.

لم أتمكن من العثور على بديل عن طريق البحث في المصحح، أو على الصفحات التي تصف typeof() في أكتيونسكريبت.

هل هناك طريقة للحصول على نوع وقت التشغيل الفعلي؟




هل هناك طريقة للحصول على نوع وقت التشغيل الفعلي؟

نعم فعلا.

var actualRuntimeType:Class = Object(yourInstance).constructor;

بعض الإجابات الأخرى تشير بالفعل إلى .constructor ، ولكن لا يمكنك دائما الوصول مباشرة .constructor في .constructor 3. ويمكن الوصول إليها فقط على الطبقات dynamic ، التي معظم الفئات ليست كذلك. سيؤدي محاولة استخدامه على فئة عادية إلى حدوث خطأ في وقت التحويل ضمن الإعدادات الافتراضية.

ومع ذلك، لأن كل فئة يرث من Object ، وهو dynamic ، يمكننا البحث عن الخاصية .constructor فقط عن طريق إرسال مثيل إلى Object .

لذلك إذا لم نكن مهتمين في الفئات الفرعية، يمكننا أن نؤكد أن حالتين هي بالضبط نفس الفئة ببساطة عن طريق تقييم هذا:

Object(instanceA).constructor === Object(instanceB).constructor;

تعلمت هذا من وظيفة " الحصول على فئة تستخدم لإنشاء مثيل كائن في AS3 " من قبل جوش تينجالا.

وهناك بديل أبسط حتى يعمل بالنسبة لي هو فقط:

var actualRuntimeType:Class = yourInstance["constructor"];

وقت التشغيل هو تماما قادرة على إعطائك .constructor ، انها مجرد أن مترجم يشكو إذا كنت تستخدم بناء الجملة. استخدام ["constructor"] يجب أن تنتج نفس بيكود، ولكن مترجم ليست ذكية بما فيه الكفاية لإيقافك.

أنا شملت هذا الثاني لأنه لم يتم اختباره في أي مكان باستثناء بلدي بيئة فلاش الحالية، في حين قال العديد من المستخدمين أن الطريقة المذكورة أعلاه يعمل بالنسبة لهم.




بشكل عام، إذا كنت ترغب في اختبار ما إذا كان أوبجكتا هو نوع فرعي من أوبجكتيب

import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;

...

if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
    ...
}



Related