المعامل new
في JavaScript
المعامل new
يُنشِئ نسخةً من كائن مُعرَّف من المستخدم أو نسخةً من أحد أنواع الكائنات المُضمّنة في لغة JavaScript والتي تملك دالةً بانيةً.
البنية العامة
new constructor[([arguments])]
constructor
صنف (class) أو دالة (function) التي تُحدِّد نوع نسخة الكائن (object instance).
arguments
قائمة بالقيم التي ستُمرَّر إلى الدالة البانية constructor
.
الوصف
إنشاء كائن مُعرَّف من المستخدم يتطلب خطوتين:
- تعريف نوع الكائن بكتابة دالة،
- إنشاء نسخة من الكائن عبر المعامل
new
.
لتعريف نوع الكائن، فيجب إنشاء دالة تُحدِّد اسمه وخاصياته، ويمكن أن يملك الكائن خاصيةً تُمثِّل بدورها كائنًا آخر.
عند تنفيذ الشيفرة new Foo(...)
فستحدث الأمور الآتية:
- سيُنشَأ كائنٌ جديدٌ ويرث من الكائن
Foo.prototype
. - ستستدعى الدالة البانية
Foo
مع تمرير الوسائط المُحدَّدة إليها، وسترتبط الكلمة المحجوزةthis
إلى الكائن الجديد الذي قد أُنشِئ؛ لاحظ أنَّnew Foo
تكافئnew Foo ()
، أي لو لم تُحدَّد قائمة وسائط فستستخدمه الدالةFoo
دون وسائط. - الكائن المُعاد من الدالة البانية سيُصبح نتيجة التعبير
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 |
---|---|---|---|---|---|
الدعم الأساسي | نعم | نعم | نعم | نعم | نعم |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 3rd Edition.
- معيار ECMAScript 1st Edition .