البرمجة

فحص الأصناف باستخدام instanceof في جافاسكربت

فحص الأصناف باستخدام instanceof في جافاسكربت

تعتبر عملية فحص الأصناف من العمليات الهامة التي يحتاجها المبرمجون في مختلف اللغات البرمجية. في جافاسكربت، يعد فحص النوع باستخدام instanceof أداة حيوية لتمييز ما إذا كان الكائن هو نوع معين من الكائنات (class) أو من صنف معين. تعني عبارة instanceof في جافاسكربت أن الكائن يمكن التحقق من كونه مثيلًا (instance) لفئة معينة أو كائن معين، مما يساعد في بناء المنطق البرمجي وفقًا لتنوع الأنواع التي قد يتم التعامل معها.

تعريف instanceof

يعد instanceof عاملًا في جافاسكربت يُستخدم لاختبار ما إذا كان كائن معين هو مثال (instance) من صنف أو دالة بناء (constructor function) معينة. يعمل هذا العامل عبر اختبار سلاسل الـ prototype. بمعنى آخر، يختبر ما إذا كان الكائن يحتوي على تلك الفئة في سلسلة السلالات الخاصة به.

الصيغة الأساسية لاستخدام instanceof هي كما يلي:

javascript
object instanceof Class

حيث:

  • object: هو الكائن الذي ترغب في اختباره.

  • Class: هو الصنف أو دالة البناء التي ترغب في اختبار الكائن ضدها.

كيفية عمل instanceof

لنفهم كيفية عمل instanceof بشكل أفضل، يمكننا النظر في المثال التالي:

javascript
function 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 الخاصة به، ويستمر في التحقق من الأسلاف حتى يعثر على المطابقة أو يصل إلى النهاية.

مثال متقدم:

javascript
function 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، وغيرها. على سبيل المثال:

javascript
const 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 معًا

javascript
function 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 أداة قوية، إلا أنه يوجد بعض القيود التي يجب أخذها في الاعتبار:

  1. الكائنات عبر النوافذ: إذا كنت تستخدم جافاسكربت عبر بيئات مختلفة (مثل النوافذ المختلفة أو الإطارات المختلفة في متصفح)، قد تحدث مشاكل في استخدام instanceof بشكل صحيح. يعود ذلك إلى أن الكائنات في نافذة معينة قد لا تكون مرتبطة بنفس الـ prototype في نافذة أخرى.

  2. التغيير في prototype: إذا قمت بتعديل prototype لأحد الأصناف بعد إنشاء الكائن، قد يتسبب ذلك في أن instanceof لا يعود يعمل كما هو متوقع.

استخدام instanceof مع الوراثة المعقدة

في جافاسكربت الحديثة، يمكن استخدام الكائنات مع الوراثة المعقدة أو الصنف (class) باستخدام الصيغ الحديثة مثل ES6. عند استخدام class، تظل طريقة عمل instanceof متوافقة مع المبدأ القديم من حيث اختبار السلاسل البرمجية (prototype chain). هنا مثال مع استخدام class:

javascript
class 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 أو الوظائف التقليدية)، ولكن يمكنك تحديد سلوك مشابه باستخدام دوال البناء. دعونا نلقي نظرة على هذا المثال:

javascript
function Car(model) { this.model = model; } const car = new Car("Toyota"); console.log(car instanceof Car); // true console.log(car instanceof Object); // true

الخلاصة

يعد instanceof أداة قوية في جافاسكربت لفحص أنواع الكائنات ومعرفة ما إذا كانت الكائنات تنتمي إلى فئة معينة أو دالة بناء. مع الفهم الصحيح لكيفية عمله، يمكن أن يساعد المبرمجين في بناء منطق برمجي معقد وديناميكي يعتمد على أنواع الكائنات.