کلمه کلیدی جدید

فراخوانی یک تابع با 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 روی یک شی جدید ساخته شده عمل می‌کنند - با "عملکردهای کارخانه" که صراحتاً یک شی را هنگام فراخوانی عادی return ، متفاوت است:

function myFunction( myArgument = false ) {
  return { "myProperty" : myArgument };
}
const myObject = myFunction( true );

myObject;
> Object { myProperty: true }

اگرچه اصول اساسی یکسان است، موارد استفاده برای توابع سازنده سفارشی توسط نحو کلاس با ویژگی های کامل تر معرفی شده در ES6 بهتر ارائه می شود.