Memanggil fungsi dengan new
akan membuat objek baru menggunakan fungsi yang dipanggil sebagai
"konstruktor" untuk objek tersebut:
function MyFunction() {}
const myObject = new MyFunction();
typeof myObject;
> "object"`
Hal ini memungkinkan "fungsi konstruktor" menyediakan {i>template<i} untuk pembuatan objek yang mengikuti pola struktural yang sama:
function MyFunction() {
this.myProperty = true;
}
const myObject = new MyFunction();
myObject.myProperty;
> true
Nilai this
dalam konstruktor
merujuk pada objek yang dibuat, sehingga objek dapat diisi
dengan properti dan metode pada saat pembuatan. Hal ini memungkinkan
pembuatan objek yang berisi nilai data dan metode apa pun yang diperlukan untuk bertindak
data tersebut sebagai unit portabel tunggal, sebuah konsep yang disebut "enkapsulasi":
function MyFunction( myArgument ) {
this.myValue = myArgument;
this.doubleMyValue = () => myArgument * 2;
}
const myObject = new MyFunction( 10 );
myObject.myValue;
> 10
myObject.doubleMyValue();
> 20
this
mengacu pada eksekusi saat ini
konteks suatu fungsi, yang berarti bahwa fungsi konstruktor mengikuti
aturan untuk nilai this
seperti fungsi lainnya. Misalnya, sebuah fungsi
yang dimaksudkan sebagai konstruktor menggunakan binding global
untuk nilai this
saat dipanggil secara independen:
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
Secara konvensional, karakter pertama dari ID fungsi konstruktor
harus diawali dengan huruf besar, mengikuti pola penamaan yang ditetapkan oleh fungsi factory bawaan
JavaScript. Meskipun terkadang Anda mungkin melihat istilah yang digunakan secara bergantian,
fungsi konstruktor—fungsi yang dimaksudkan untuk bertindak pada objek yang baru dibuat
saat dipanggil dengan kata kunci new
—berbeda dengan "fungsi
factory", yang secara eksplisit return
objek
saat dipanggil secara normal:
function myFunction( myArgument = false ) {
return { "myProperty" : myArgument };
}
const myObject = myFunction( true );
myObject;
> Object { myProperty: true }
Meskipun prinsip dasarnya sama, kasus penggunaan untuk kustom fungsi konstruktor lebih baik dilayani oleh fitur yang lebih lengkap Sintaksis Class diperkenalkan di ES6.