الكلمة الرئيسية الجديدة

يؤدي استدعاء دالة باستخدام 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.