سؤال

وأرى الكثير من التعليمات البرمجية مثل هذا:

function Base() {}
function Sub() {}
Sub.prototype = new Base();

ولكن، إذا كنت تفعل:

s = new Sub();
print(s.constructor == Sub);

وهذا غير صحيح. هذا يبدو مربكا بالنسبة لي، منذ منشئ الصورة هو، في الواقع، الفرعية. هل التقليدية / الأفضل أن تفعل هذا؟

function Base() {}
function Sub() {}
Sub.prototype = new Base();
Sub.prototype.constructor = Sub;

وأم أنه لا يهم حقا؟

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

المحلول

'منشئ' لا تفعل ما يبدو أنه يفعل. هذا، بالإضافة إلى عدم standardness والخمسين، هو سبب وجيه لتجنب استخدامه - العصا مع instanceof والنموذج

ومن الناحية الفنية: 'منشئ' ليست ملكا للالمثال الصورة "، بل هو ملك لل" الفرعية "كائن النموذج تظهر من خلال. عند إنشاء وظيفة "الفرعية" في موزيلا، وتحصل على وجوه Sub.prototype الافتراضي المسكوكة حديثا والتي لديها "منشئ" مشيرا الى وظيفة الفرعية على سبيل المجاملة.

ولكن هل ثم الاستعاضة عن ذلك النموذج مع قاعدة جديدة (). يتم فقدان النموذج الافتراضي الأصلي مع وصلة الى الفرعية. بدلا من ذلك، Sub.prototype هو مثيل من قاعدة دون أي ممتلكات الغلابة "منشئ". لذلك:

new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base

... على طول الطريق إلى كائن أبسط التي لم تغيير النموذج.

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

هل التقليدية / الأفضل أن تفعل هذا؟

عند التعامل مع جافا سكريبت الأشياء / الطبقات ليس هناك اتفاقية واحدة. نظام metaclass كل المكتبة تتصرف بشكل مختلف قليلا. أنا لم أر واحد أن يكتب "منشئ" لكل فئة مشتقة يدويا، ولكن يبدو جيدا كحل مثل أي إذا كنت تريد حقا أن يكون منشئ الحقيقية المتاحة. فإنه سيتم أيضا جعل رمز متوافق مع المتصفحات / المحركات التي لا تعطيك "منشئ".

وكنت تنظر يعطيها اسما مختلفا، على الرغم من، لتجنب الخلط بينها وبين خاصية "منشئ" القائمة ويتصرف بشكل مختلف.

نصائح أخرى

إذا كنت ترغب في اختبار ما إذا كان الهدف من ذلك هو بالضبط مثيل الفرعية استخدام المشغل instanceof: -

print(s instanceof Sub);

إذا كنت تريد أن تعرف ما إذا كان الهدف من ذلك هو مثيل Sub أو مثيل على مستوى فرعية من الفرعية استخدام الأسلوب isPrototypeOf: -

print(Sub.prototype.isPrototypeOf(s));

نعم،

Sub.prototype.constructor = Sub;

ودعونا استخدام instanceof ولكن هناك حل أفضل. انظر هنا:، TDD JS الميراث على جيثب ، والعثور على <م > الجمع بين الطفيلية الميراث نمط. وTDD'd رمز لذلك يجب عليك أن تكون قادرا على جروك بسرعة كبيرة ثم ببساطة تغيير أسماء للحصول على انك بدأته. هذا هو أساسا ما YAHOO.lang.extend الاستخدامات (المصدر: موظف ياهو وجافا سكريبت المهنية مؤلف نيكولاس Zakas لمطور ويب، وED 2ND، صفحة 181). كتاب جيد بالمناسبة (لا ينتمي بأي شكل من الأشكال!)

لماذا؟ لأن نمط الكلاسيكي كنت تعمل مع ديه فار إشارة staticy (إذا قمت بإنشاء فار آر = [1،2] في كائن قاعدة، وALL الحالات قرأت / الكتابة وسوف "دولة حصة" من "آر '! إذا كنت استخدام منشئ سرقة يمكنك الحصول على حول هذا انظر الأمثلة التي ذكرتها.

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