نحن نعلم أنه يتم استخدام عامل التشغيل للتحقق مما إذا كان الكائن هو مثيل للمنشئ. يتم سرد السيناريوهات المختلفة التي ترجع فيها صحيحًا أدناه.
1. يتم إنشاء الكائن obj من خلال مُنشئ جديد، ثم يكون مثيل obj للمُنشئ صحيحًا
انسخ رمز الكود كما يلي:
وظيفة الشخص (ن، أ) {
this.name = n;
this.age = a;
}
var p = new Person('John Backus', 82);
console.log(p مثيل الشخص);
2. إذا كانت هناك علاقة ميراث، فإن مثيل الفئة الفرعية والفئة الأصلية سيعود أيضًا صحيحًا.
انسخ رمز الكود كما يلي:
الدالة أ(){}
الدالة ب(){}
B.prototype = new A(); // B يرث من A
var b = new B();
console.log(b مثيل A);
3. نظرًا لأن الكائن هو الفئة الجذرية، فإن جميع الفئات المخصصة الأخرى ترث منه، وبالتالي فإن مثيل الكائن لأي مُنشئ يعود صحيحًا.
انسخ رمز الكود كما يلي:
الدالة أ () {}
var a = new A();
console.log(مثيل للكائن);
var str = new String('hello');
console.log(str مثيل الكائن);
فار نوم = رقم جديد(1);
console.log (رقم مثيل الكائن) // صحيح
حتى المنشئ نفسه
انسخ رمز الكود كما يلي:
الدالة أ () {}
console.log(مثيل للكائن);
console.log(سلسلة مثيل للكائن);
console.log(رقم مثيل الكائن);
4. جميع مثيلات الدالة المنشئة تعود صحيحة
انسخ رمز الكود كما يلي:
الدالة أ () {}
console.log(مثيل للوظيفة);
console.log(سلسلة مثيلات الوظيفة) // صحيح
console.log(رقم مثيل الوظيفة) // صحيح
يتم تلخيص النقاط الأربع المذكورة أعلاه في جملة واحدة: إذا تم إنشاء مثيل بواسطة فئة معينة أو فئتها الفرعية، فإن مثيل المثيل يُرجع صحيحًا. أو إذا كان النموذج الأولي لمنشئ معين موجودًا في سلسلة النموذج الأولي الداخلية للكائن obj، فسيتم إرجاع true. أي أن نتيجة المثيل ليس لها علاقة مباشرة بالمنشئ نفسه. وهذا أمر شائع في العديد من اللغات.
يتم تعريف فئة "Person" في Java، ويُرجع المثيل p صحيحًا لكل من الشخص والكائن.
انسخ رمز الكود كما يلي:
شخص من الدرجة {
اسم السلسلة العامة؛
العمر العام؛
شخص (سلسلة ن، كثافة العمليات أ) {
this.name = name;
this.age = a;
}
public static void main(String[] args) {
Person p = new Person("John Backus", 82);
System.out.println(pمثيل الشخص);// صحيح
System.out.println(p مثيل للكائن)؛
}
}
إذا كانت هناك علاقة وراثة في Java، فسيُرجع مثيل الفئة الأصلية للفئة الفرعية أيضًا صحيحًا.
انسخ رمز الكود كما يلي:
// فئة الوالدين
شخص من الدرجة {
اسم السلسلة العامة؛
العمر العام؛
شخص (سلسلة ن، كثافة العمليات أ) {
اسم = اسم؛
العمر = أ؛
}
}
// فئة فرعية
رجل الطبقة العامة يمتد الشخص {
جامعة سترينج العامة؛
رجل (سلسلة ن، كثافة العمليات، سلسلة ق) {
سوبر (ن، أ)؛
الجامعة = س؛
}
public static void main(String[] args) {
Man mm = new Man("John Resig", 29, "PKU");
System.out.println(مم مثيل مان);
System.out.println (مم مثيل للشخص)؛ // صحيح أيضًا
}
}
مع العلم بذلك، فإن الأداء التالي في JS ليس مفاجئًا
انسخ رمز الكود كما يلي:
// تحديد منشئين
الدالة أ(){}
الدالة ب(){}
A.prototype = B.prototype = {a: 1};
// أنشئ مثيلين لمنشئين مختلفين على التوالي
var a = new A();
var b = new B();
console.log(مثيل B);// صحيح
console.log(b مثيل A);
نرى أنه تم إنشاء a وb باستخدام A وB على التوالي، ولكن كلا مثيلي B وb من A صحيحان. أي أنه على الرغم من عدم إنشاء a باستخدام المُنشئ B، فإنه لا يزال يُرجع صحيحًا. نظرًا لوجود B.prototype في سلسلة النموذج الأولي الداخلية لـ a.
نظرًا لخصائص اللغة الديناميكية لـ JS، يمكن تعديل النموذج الأولي في وقت التشغيل، لذلك ليس من المستغرب أن تُرجع النتائج التالية خطأ. نظرًا لأن A.prototype لم يعد موجودًا في سلسلة النموذج الأولي الداخلية، فقد تمت مقاطعة السلسلة.
انسخ رمز الكود كما يلي:
الدالة أ(){}
var a = new A();
A.prototype = {}; // قم بتعديل النموذج الأولي ديناميكيًا، يرجى ملاحظة أنه يجب القيام بذلك بعد إنشاء ملف
console.log(مثيل لـ A);
لاحظ أن كتابة هذا أيضًا تكسر النقطة الأولى الملخصة أعلاه: يتم إنشاء الكائن obj من خلال مُنشئ جديد، ثم يكون مثيل obj للمُنشئ صحيحًا
في الواقع، في معيار ECMAScript (يخضع للإصدار 5.1)، سوف يستدعي التنفيذ الداخلي لمثيل الطريقة الداخلية [[HasInstance]] للمنشئ، والتي يتم وصفها على النحو التالي
إذا كان F كائن دالة، فعند تنفيذ F(V)، ستحدث الخطوات التالية:
1. إذا كان المعامل الأيسر V للمثيل ليس من نوع الكائن، فقم بإرجاع خطأ مباشرة.
انسخ رمز الكود كما يلي:
فار أ، ب = 1، ج = صحيح، د = 'مرحبا'؛
console.log(مثيل للكائن); // خطأ هنا القيمة غير محددة
console.log(bمثيل الكائن);//خطأ
console.log(c مثيل الكائن); // خطأ
console.log(d مثيل الكائن); // خطأ
2/3. احصل على سمة النموذج الأولي للمنشئ F. إذا لم يكن نوع كائن، فيجب طرح استثناء TypeError.
انسخ رمز الكود كما يلي:
الدالة أ(){}
A.prototype = 1; // قم بتعيين النموذج الأولي لـ A على نوع غير كائن
var a = new A();
console.log(مثيل لـ A);
تختلف مطالبات الاستثناء التي يطرحها كل متصفح.
فايرفوكس 18:
كروم 24:
سفاري 6:
أوبرا 12:
IE10:
4. قم بتنفيذ المنطق التالي باستمرار: اضبط V على V للنموذج الأولي الداخلي، وقم بإرجاع false إذا كانت V فارغة، وقم بإرجاع true إذا كان كل من V وO يشيران إلى نفس الكائن.