La nuova parola chiave

La chiamata di una funzione con new crea un nuovo oggetto utilizzando la funzione chiamata come "costruttore" dell'oggetto:

function MyFunction() {}
const myObject = new MyFunction();

typeof myObject;
> "object"`

Ciò consente a una "funzione costruttore" di fornire un modello per la creazione di oggetti che seguono lo stesso modello strutturale:

function MyFunction() {
  this.myProperty = true;
}
const myObject = new MyFunction();

myObject.myProperty;
> true

Il valore this all'interno di una funzione del costruttore si riferisce all'oggetto creato, consentendo il completamento di proprietà e metodi dell'oggetto al momento della creazione. Ciò consente la creazione di oggetti che contengono valori dei dati e qualsiasi metodo necessario per agire su tali dati come un'unica unità portabile, un concetto chiamato "incapsulamento":

function MyFunction( myArgument ) {
    this.myValue = myArgument;
    this.doubleMyValue = () => myArgument * 2;
}
const myObject = new MyFunction( 10 );

myObject.myValue;
> 10

myObject.doubleMyValue();
> 20

this si riferisce all'attuale contesto di esecuzione di una funzione, il che significa che una funzione del costruttore segue le stesse regole per il valore di this di qualsiasi altra funzione. Ad esempio, una funzione intesa come costruttore utilizza l'associazione globale per il valore di this se richiamata in modo indipendente:

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

È convenzionale utilizzare le maiuscole per il primo carattere dell'identificatore di una funzione del costruttore, seguendo il modello di denominazione stabilito dalle funzioni di fabbrica integrate di JavaScript. Anche se a volte potresti notare che i termini sono usati in modo intercambiabile, le funzioni di creazione (ovvero quelle che hanno lo scopo di agire su un oggetto di nuova creazione quando richiamate con la parola chiave new) sono diverse dalle "funzioni di fabbrica", che sono esplicitamente return un oggetto quando richiamate normalmente:

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

myObject;
> Object { myProperty: true }

Sebbene i principi di base siano gli stessi, i casi d'uso delle funzioni personalizzate del costruttore sono serviti meglio dalla sintassi più completa di Class introdotta in ES6.