المعامل instanceof في JavaScript

من موسوعة حسوب
< JavaScript
مراجعة 15:44، 28 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

المعامل instanceof يختبر إذا كانت الخاصية prototype لدالة بانية تظهر في أيّ مكان في سلسلة prototype لأحد الكائنات.

البنية العامة

object instanceof constructor

object

الكائن الذي نريد معرفة إن كانت خاصية prototype للدالة البانية constructor ستظهر في أي مكان في سلسلة prototype الخاصة به.

constructor

الدالة البانية التي سنختبر الكائن بها.

الوصف

يختبر المعامل instanceof وجود الخاصية constructor.prototype في سلسلة prototype للكائن object.

// تعريف الدوال البانية
function C() {}
function D() {}

var o = new C();

// true: Object.getPrototypeOf(o) === C.prototype
o instanceof C;

// false, D.prototype ليست موجودةً في سلسلة prototype
o instanceof D;

o instanceof Object; // true, لأن:
C.prototype instanceof Object // true

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

// false, لأن C.prototype
// ليست موجودةً في سلسلة prototype
// للكائن o
o instanceof C; 

// إضافة الكائن C إلى سلسلة
// prototype للكائن D
D.prototype = new C();
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true, C.prototype موجودة في سلسلة الكائن o3

لاحظ أنَّ قيمة الاختبار instanceof قد تختلف اعتمادًا على خاصية prototype للدوال البانية، ويمكن تغييرها بتغيير سلسلة prototype للكائن عبر الدالة Object.setPrototypeOf()‎.

أمثلة

الكائنان String و Date نوعهما هو Object

الشيفرة الآتية تستخدم المعامل instanceof لتوضيح أنَّ الكائنين String و Date مشتقان من الكائن Object.

لكن الكائنات المُنشَأة بالشكل المختصر هي استثناءٌ هنا، لأنَّ سلسلة prototype لها غير مُعرَّفة، لكنه التعبير instanceof Object سيعيد true.

var simpleStr = 'This is a simple string'; 
var myString  = new String();
var newStr    = new String('String created with constructor');
var myDate    = new Date();
var myObj     = {};

simpleStr instanceof String; // false, لأن سلسلة prototype قيمتها هي undefined
myString  instanceof String; // true
newStr    instanceof String; // true
myString  instanceof Object; // true

myObj instanceof Object;    // true, على الرغم من أنَّ قيمة الخاصية prototype هو undefined
({})  instanceof Object;    // true, كما في الحالة السابقة

myString instanceof Date;   // false

myDate instanceof Date;     // true
myDate instanceof Object;   // true
myDate instanceof String;   // false

استخدام المعامل instanceof على كائن خاص

سنُنشِئ في المثال الآتي كائنًا نوعه هو Car وسنُنشِئ نسخةً منه باسم mycar، وسيوضِّح المعامل instanceof أنَّ الكائن mycar من النوع Car و Object:

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
var mycar = new Car('Honda', 'Accord', 1998);
var a = mycar instanceof Car;    // true
var b = mycar instanceof Object; // true

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات