คีย์เวิร์ดใหม่

การเรียกฟังก์ชันด้วย 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

ธรรมเนียมปฏิบัติคือให้ใช้อักษรตัวแรกของตัวระบุของฟังก์ชันคอนสตรัคเตอร์เป็นตัวพิมพ์ใหญ่ตามรูปแบบการตั้งชื่อที่ฟังก์ชันแฟกทอรีในตัวของ JavaScript กำหนดไว้ แม้บางครั้งคุณอาจเห็นคำที่ใช้สลับกันไป ฟังก์ชันตัวสร้าง—ฟังก์ชันที่มีจุดประสงค์เพื่อดำเนินการกับ เมื่อเรียกใช้ด้วยคีย์เวิร์ด new ซึ่งแตกต่างจาก "จากโรงงาน" ฟังก์ชัน" ซึ่งชัดเจน return ออบเจ็กต์เมื่อเรียกใช้ตามปกติ:

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

myObject;
> Object { myProperty: true }

แม้ว่าหลักการพื้นฐานจะเหมือนกัน แต่กรณีการใช้งานของฟังก์ชันคอนสตรัคเตอร์ที่กำหนดเองจะทำงานได้ดีขึ้นด้วยไวยากรณ์คลาสที่มีคุณสมบัติครบถ้วนกว่าซึ่งเปิดตัวใน ES6