يؤدي استدعاء دالة باستخدام new
إلى إنشاء عنصر جديد باستخدام الدالة التي تمّ استدعاؤها كأحد
"عوامل الإنشاء" لهذا العنصر:
function MyFunction() {}
const myObject = new MyFunction();
typeof myObject;
> "object"`
يتيح هذا "دالة إنشائية" توفير قالب لإنشاء الكائنات التي تتبع نفس النمط الهيكلي:
function MyFunction() {
this.myProperty = true;
}
const myObject = new MyFunction();
myObject.myProperty;
> true
قيمة this
ضمن الدالة الإنشائية
تشير الدالة إلى الكائن الذي يتم إنشاؤه، مما يتيح تعبئة الكائن
باستخدام الخصائص والطرق في وقت الإنشاء. يسمح هذا
إنشاء الكائنات التي تحتوي على قيم البيانات وأي طرق مطلوبة للعمل على
تلك البيانات كوحدة محمولة واحدة، وهو مفهوم يسمى "التغليف":
function MyFunction( myArgument ) {
this.myValue = myArgument;
this.doubleMyValue = () => myArgument * 2;
}
const myObject = new MyFunction( 10 );
myObject.myValue;
> 10
myObject.doubleMyValue();
> 20
يشير this
إلى عملية التنفيذ الحالية
سياق الدالة، بمعنى أن الدالة الإنشائية تتبع نفس
لقيمة this
كأي دالة أخرى. على سبيل المثال، تستخدم الدالة
المخصّصة لإنشاء عنصر الربط العام
لقيمة this
عند استدعائها بشكل مستقل:
function MyFunction() {
console.log( this );
}
const myObject = new MyFunction();
> MyFunction { }
MyFunction(); // Global `this` binding outside of strict mode is `globalThis`
> Window { … }
(function() {
"use strict";
function MyFunction() {
console.log( this );
}
MyFunction(); // Global `this` binding inside of strict mode is `undefined`
}());
> undefined
من المعتاد أن تبدأ كتابة الحرف الأول من دالة الدالة الإنشائية بحرف لاتيني كبير.
باتباع نمط التسمية الذي تم إنشاؤه بواسطة واجهة برمجة التطبيقات المضمنة
وظائف المصنع. وعلى الرغم من أنك قد ترى في بعض الأحيان المصطلحات مستخدمة بالتبادل،
دوال الإنشاء — الدوال التي تهدف إلى العمل على دالة إنشاء حديث
يختلف عن هذا الكائن عند استدعائه باستخدام الكلمة الرئيسية new
- عن "factory"
الدوال"، التي صريحًا return
كائن عند استدعائه بشكل طبيعي:
function myFunction( myArgument = false ) {
return { "myProperty" : myArgument };
}
const myObject = myFunction( true );
myObject;
> Object { myProperty: true }
على الرغم من أن المبادئ الأساسية هي نفسها، فإن حالات استخدام تُخدم الدوال الإنشائية بشكل أفضل من خلال الدوال الإنشائية الأكثر تكاملاً تم تقديم بنية Class في ES6.