المعامل new في JavaScript

من موسوعة حسوب

المعامل new يُنشِئ نسخةً من كائن مُعرَّف من المستخدم أو نسخةً من أحد أنواع الكائنات المُضمّنة في لغة JavaScript والتي تملك دالةً بانيةً.

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

new constructor[([arguments])]

constructor

صنف (class) أو دالة (function) التي تُحدِّد نوع نسخة الكائن (object instance).

arguments

قائمة بالقيم التي ستُمرَّر إلى الدالة البانية constructor.

الوصف

إنشاء كائن مُعرَّف من المستخدم يتطلب خطوتين:

  1. تعريف نوع الكائن بكتابة دالة،
  2. إنشاء نسخة من الكائن عبر المعامل new.

لتعريف نوع الكائن، فيجب إنشاء دالة تُحدِّد اسمه وخاصياته، ويمكن أن يملك الكائن خاصيةً تُمثِّل بدورها كائنًا آخر.

عند تنفيذ الشيفرة new Foo(...)‎ فستحدث الأمور الآتية:

  1. سيُنشَأ كائنٌ جديدٌ ويرث من الكائن Foo.prototype.
  2. ستستدعى الدالة البانية Foo مع تمرير الوسائط المُحدَّدة إليها، وسترتبط الكلمة المحجوزة this إلى الكائن الجديد الذي قد أُنشِئ؛ لاحظ أنَّ new Foo تكافئ new Foo ()‎، أي لو لم تُحدَّد قائمة وسائط فستستخدمه الدالة Foo دون وسائط.
  3. الكائن المُعاد من الدالة البانية سيُصبح نتيجة التعبير new النهائية، وإذا لم تُعد الدالة البانية كائنًا فسيُستخدَم الكائن المُنشَأ في الخطوة رقم 1 (وعمومًا لا تُعيد الدوال البانية قيمةً، لكن قد تستفيد من ذلك إذا أردتَ تجاوز عملية إنشاء الكائن الاعتيادية).

يمكنك إضافة خاصية إلى كائن مُنشأ مسبقًا في أيّ وقت، فمثلًا التعبير البرمجي car1.color = "black"‎ سيُضيف الخاصية color إلى الكائن car1 ويضبط قيمتها إلى السلسلة النصية black، لكن ذلك لن يؤثر على أيّة كائنات أخرى من نفس النوع، وإنما عليك إضافة الخاصية إلى تعريف الصنف Car لتُطبَّق على جميع نسخ الكائنات.

يمكنك إضافة خاصية مشتركة إلى جميع الكائنات المنشأة من نوع بيانات معيّن باستخدام الخاصية Function.prototype، وهذا سيؤدي إلى تعريف خاصية مشتركة بين جميع الكائنات ذات النوع المُحدَّد بدلًا من أن تكون خاصةً بنسخة معيّنة؛ فالشيفرة الآتية تُضيف الخاصية color ذات القيمة null إلى جميع الكائنات ذات النوع Car، ثم سنعيد الكتابة فوق تلك القيمة بإسناد السلسلة النصية black إليها في الكائن car1 فقط.

function Car() {}
car1 = new Car();
 
console.log(car1.color); // undefined
 
Car.prototype.color = null;
console.log(car1.color); // null
 
car1.color = 'black';
console.log(car1.color); // black

أمثلة

إنشاء نسخة من نوع الكائنات

لنفترض أنَّك تريد إنشاء نوع كائنات خاص بالسيارات، وأردتَ أن يكون اسم هذا النوع من الكائنات Car، وأردتَ أن يكون له خاصيات لذكر المصنع والموديل والسنة، ولفعل ذلك كتبتَ الدالة الآتية:

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

يمكنك الآن إنشاء كائن باسم mycar كما يلي:

var mycar = new Car('Eagle', 'Talon TSi', 1993);

التعبير البرمجي السابق يُنشِئ الكائن mycar ويُمرِّر إلى الدالة البانية عدِّة وسائط لتضبط قيم خاصياته؛ أي أنَّ قيمة الخاصية mycar.make هي السلسلة النصية Eagle، والخاصية mycar.year هي رقمٌ صحيحٌ قيمته 1993، وهكذا. يمكنك إنشاء أي عدد من كائنات Car باستخدام المعامل new مجددًا:

var kenscar = new Car('Nissan', '300ZX', 1992);

إسناد كائن إلى إحدى خاصيات كائن آخر

لنقل أنَّنا عرّفنا كائنًا باسم Person كما يلي:

function Person(name, age, sex) {
  this.name = name;
  this.age = age;
  this.sex = sex;
}

ثم أنشأنا نسختين منه كما يلي:

var rand = new Person('Bashir Ameen', 33, 'M');
var ken = new Person('Ayham Mansor', 39, 'M');

وأعدنا كتابة تعريف نوع الكائنات Car لتضمين الخاصية owner التي تأخذ كائنًا من النوع Person:

function Car(make, model, year, owner) {
  this.make = make;
  this.model = model;
  this.year = year;
  this.owner = owner;
}

ثم أنشأنا كائنين يُمثِّلان سيارتين كما يلي:

var car1 = new Car('Eagle', 'Talon TSi', 1993, rand);
var car2 = new Car('Nissan', '300ZX', 1992, ken);

فبدلًا من تمرير سلسلة نصية أوليّة أو قيمة عددية عند إنشاء كائن جديد، فمررنا الكائنين rand و ken كمعاملات إلى الدالة البانية Car، ولمعرفة اسم صاحب السيارة car2 فيمكننا استخدام التعبير الآتي:

car2.owner.name

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

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

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