فحص الأصناف باستخدام instanceof في جافاسكربت
تعتبر عملية فحص الأصناف من العمليات الهامة التي يحتاجها المبرمجون في مختلف اللغات البرمجية. في جافاسكربت، يعد فحص النوع باستخدام instanceof أداة حيوية لتمييز ما إذا كان الكائن هو نوع معين من الكائنات (class) أو من صنف معين. تعني عبارة instanceof في جافاسكربت أن الكائن يمكن التحقق من كونه مثيلًا (instance) لفئة معينة أو كائن معين، مما يساعد في بناء المنطق البرمجي وفقًا لتنوع الأنواع التي قد يتم التعامل معها.
تعريف instanceof
يعد instanceof عاملًا في جافاسكربت يُستخدم لاختبار ما إذا كان كائن معين هو مثال (instance) من صنف أو دالة بناء (constructor function) معينة. يعمل هذا العامل عبر اختبار سلاسل الـ prototype. بمعنى آخر، يختبر ما إذا كان الكائن يحتوي على تلك الفئة في سلسلة السلالات الخاصة به.
الصيغة الأساسية لاستخدام instanceof هي كما يلي:
javascriptobject instanceof Class
حيث:
-
object: هو الكائن الذي ترغب في اختباره. -
Class: هو الصنف أو دالة البناء التي ترغب في اختبار الكائن ضدها.
كيفية عمل instanceof
لنفهم كيفية عمل instanceof بشكل أفضل، يمكننا النظر في المثال التالي:
javascriptfunction Animal(name) {
this.name = name;
}
const dog = new Animal("Dog");
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true
console.log(dog instanceof Array); // false
في المثال السابق، يتم اختبار كائن dog لمعرفة ما إذا كان من النوع Animal أو Object أو Array. النتيجة ستكون:
-
dog instanceof Animalتُرجعtrueلأن الكائنdogهو مثيل منAnimal. -
dog instanceof Objectتُرجعtrueلأن جميع الكائنات في جافاسكربت، بما في ذلك الكائنات المخصصة، ترث من الكائن الأساسيObject. -
dog instanceof Arrayتُرجعfalseلأنdogليس مثيلًا من صنفArray.
سلوك instanceof مع السلاسل البرمجية (Prototype Chain)
instanceof يعمل من خلال فحص سلسلة الـ prototype للكائن المعني. عند استخدام instanceof، يقوم جافاسكربت بمقارنة الكائن مع سلسلة الـ prototype الخاصة به، ويستمر في التحقق من الأسلاف حتى يعثر على المطابقة أو يصل إلى النهاية.
مثال متقدم:
javascriptfunction Person(name) {
this.name = name;
}
function Employee(name, job) {
Person.call(this, name);
this.job = job;
}
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
const employee = new Employee("John", "Developer");
console.log(employee instanceof Employee); // true
console.log(employee instanceof Person); // true
console.log(employee instanceof Object); // true
في هذا المثال:
-
employee instanceof Employeeتُرجعtrueلأنemployeeهو مثيل منEmployee. -
employee instanceof PersonتُرجعtrueلأنEmployeeيرث منPerson. -
employee instanceof Objectتُرجعtrueلأن جميع الكائنات في جافاسكربت ترث في النهاية منObject.
استخدام instanceof مع أنواع بيانات مدمجة
يمكن أيضًا استخدام instanceof لاختبار الأنواع المدمجة في جافاسكربت مثل Array, Date, RegExp، وغيرها. على سبيل المثال:
javascriptconst arr = [1, 2, 3];
const date = new Date();
console.log(arr instanceof Array); // true
console.log(date instanceof Date); // true
console.log(arr instanceof Object); // true
console.log(date instanceof Object); // true
مقارنة بين instanceof وtypeof
تعتبر typeof و instanceof أدوات لفحص أنواع البيانات في جافاسكربت، ولكن كل منهما تستخدم لأغراض مختلفة:
-
typeof: يستخدم عادةً لاختبار الأنواع الأولية مثل الأرقام (number)، السلاسل النصية (string)، البولات (boolean)، الدوال (function)، وغيرهم. -
instanceof: يستخدم لاختبار ما إذا كان الكائن ينتمي إلى نوع معين أو فئة معينة.
مثال على استخدام typeof و instanceof معًا
javascriptfunction testType(value) {
if (typeof value === 'number') {
console.log("It's a number");
} else if (typeof value === 'string') {
console.log("It's a string");
} else if (value instanceof Array) {
console.log("It's an array");
} else {
console.log("Unknown type");
}
}
testType(42); // It's a number
testType("Hello!"); // It's a string
testType([1, 2, 3]); // It's an array
قيود instanceof
على الرغم من أن instanceof أداة قوية، إلا أنه يوجد بعض القيود التي يجب أخذها في الاعتبار:
-
الكائنات عبر النوافذ: إذا كنت تستخدم جافاسكربت عبر بيئات مختلفة (مثل النوافذ المختلفة أو الإطارات المختلفة في متصفح)، قد تحدث مشاكل في استخدام
instanceofبشكل صحيح. يعود ذلك إلى أن الكائنات في نافذة معينة قد لا تكون مرتبطة بنفس الـ prototype في نافذة أخرى. -
التغيير في
prototype: إذا قمت بتعديلprototypeلأحد الأصناف بعد إنشاء الكائن، قد يتسبب ذلك في أنinstanceofلا يعود يعمل كما هو متوقع.
استخدام instanceof مع الوراثة المعقدة
في جافاسكربت الحديثة، يمكن استخدام الكائنات مع الوراثة المعقدة أو الصنف (class) باستخدام الصيغ الحديثة مثل ES6. عند استخدام class، تظل طريقة عمل instanceof متوافقة مع المبدأ القديم من حيث اختبار السلاسل البرمجية (prototype chain). هنا مثال مع استخدام class:
javascriptclass Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
}
const dog = new Dog("Rex", "German Shepherd");
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true
instanceof مع الكائنات المبنية على دوال
في بعض الأحيان، قد لا يكون لديك فئات تقليدية (بالاستخدام مع class أو الوظائف التقليدية)، ولكن يمكنك تحديد سلوك مشابه باستخدام دوال البناء. دعونا نلقي نظرة على هذا المثال:
javascriptfunction Car(model) {
this.model = model;
}
const car = new Car("Toyota");
console.log(car instanceof Car); // true
console.log(car instanceof Object); // true
الخلاصة
يعد instanceof أداة قوية في جافاسكربت لفحص أنواع الكائنات ومعرفة ما إذا كانت الكائنات تنتمي إلى فئة معينة أو دالة بناء. مع الفهم الصحيح لكيفية عمله، يمكن أن يساعد المبرمجين في بناء منطق برمجي معقد وديناميكي يعتمد على أنواع الكائنات.

