سؤال

الرجاء مساعدتي على فهم لماذا البرمجية التالية يعمل:

<script>
    var re = RegExp('\\ba\\b') ;
    alert(re.test('a')) ;
    alert(re.test('ab')) ;
</script>

في السطر الأول لا يوجد new المشغل.

بقدر ما أعرف ، contructor في جافا سكريبت هي وظيفة تهيئة الكائنات التي تم إنشاؤها من قبل المشغل new وأنها لا تعني العودة إلى أي شيء.

هل كانت مفيدة؟

المحلول

بشكل عام, إذا كان هناك شيء غير موثقة باعتباره المنشئ ، استخدام new مع ذلك.ولكن في هذه الحالة ، RegExp يحتوي على تعريف "مصنع" السلوك عن الحالة التي تكون فيها كنت قد دعا أنها وظيفة بدلا من ذلك.انظر القسم 15.10.3 من ECMAScript (جافا سكريبت) مواصفات (أن الروابط المنتهية ولايته المواصفات ؛ القسم العدد هو نفسه في المواصفات التي يمكنك تحميل من ECMA الصفحة الأولى [على اليمين];أنا لا أريد أن مباشرة رابط ~4MB ملف PDF):

15.10.3 RegExp منشئ كما دعا وظيفة
15.10.3.1 RegExp(نمط والأعلام)
إذا كان النمط هو كائن R الذي [[الصف]] الخاصية "RegExp" والأعلام غير معرف ، ثم العودة R دون تغيير.وإلا استدعاء RegExp منشئ (15.10.4.1) ، ويمر هذا النمط والأعلام الحجج و العودة الكائن شيدت من قبل أن منشئ.

في الواقع يمكنك تحديد الخاصة بك جافا سكريبت منشئ وظائف للسماح حذف new الكلمات الرئيسية (عن طريق الكشف كانوا كما دعا وظيفة بدلا من الدوران في المكان و يطلقون على أنفسهم بشكل صحيح), ولكن أنا لا أقترح أنه يؤدي إلى تضليل رمز.

نصائح أخرى

و+1 TJ كراودر له ذلك. وECMAScript القياسية يخرج من طريقها لتحديد السلوكيات لوظائف منشئ المدمج في حين دعا وظائف مدنية. غالبا ما يدعو ببساطة نفسه مرة أخرى باعتباره المنشئ، ولكن هناك بعض الحالات الأكثر تعقيدا.

<اقتباس فقرة>   

والصانعين في جافا سكريبت [...] لا يعني أي شيء مقابل

في عام، منشئ <م> يمكن تجاهل this والعودة فقط كائن مستقل:

function Thing() {
    return {'foo': 1};
}

في هذه الحالة يمكنك استخدام بالتساوي الدالة كما منشئ (مع new) أو وظيفة مدنية.

إذا لم منشئ يعود أي شيء كما هو النمط المعتاد للمنشئات، المشغل new نفسه يضمن أن تقوم بإرجاع كائن جديد تم إنشاؤه ومرت كما this. في هذه الحالة يجب استخدام new.

وأنه من الأفضل عدم الاعتماد على منشئ العمل بوصفها وظيفة العارية، والسلوكيات البديلة من المدمج في المنشئات نادرا ما تكون من أي استخدام، لذلك عموما يجب التمسك new.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top