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





typeof (7)


Object obj = new Object();
Object o = new Object();

if(o.getClass().getName().endsWith(obj.getClass().getName())){
    return true;    
}else{
        return false;
}

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

typeof(control1) != typeof(control2)

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

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

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




ستحتاج إلى استخدام Object.prototype.constructor.

من الوثائق :

 dynamic class A {}
  trace(A.prototype.constructor);      // [class A]
  trace(A.prototype.constructor == A); // true
  var myA:A = new A();
  trace(myA.constructor == A);         // true

(مريح، وهذا هو أيضا كيفية التحقق من أنواع في جافا سكريبت، وهو ما أدى لي في الأصل إلى هذا في المستندات)

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

public function checkType():void {
    trace(prototype.constructor, prototype.constructor == Player);
    // shows [class Player] true
}



يحتوي أكتيونسكريبت 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 أكتيونسكريبت من هو المشغل هو مثيل .




إذا كنت ترغب في حساب الميراث، فقد ترغب في تجربة شيء من هذا القبيل:

if (objectA is objectB.constructor || objectB is objectA.constructor)
{
    // ObjectA inherits from ObjectB or vice versa
}



أفضل طريقة لاستخدام flash.utils.getQualifiedClassName() . بالإضافة إلى ذلك، يمكنك استخدام flash.utils.describeType() للحصول على وثيقة شمل يصف أكثر عن الفصل.




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

نعم فعلا.

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"] يجب أن تنتج نفس بيكود، ولكن مترجم ليست ذكية بما فيه الكفاية لإيقافك.

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