A nova palavra-chave

Chamar uma função com new cria um novo objeto usando a função chamada como o "construtor" desse objeto:

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

typeof myObject;
> "object"`

Isso permite que uma "função de construtor" forneça um modelo para a criação de objetos que seguem o mesmo padrão estrutural:

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

myObject.myProperty;
> true

O valor de this em uma função construtora se refere ao objeto que está sendo criado, permitindo que ele seja preenchido com propriedades e métodos no momento da criação. Isso permite a criação de objetos que contêm valores de dados e quaisquer métodos necessários para agir sobre esses dados como uma única unidade portátil, um conceito chamado "encapsulamento":

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

myObject.myValue;
> 10

myObject.doubleMyValue();
> 20

this se refere ao contexto de execução atual de uma função, o que significa que uma função de construtor segue as mesmas regras para o valor de this que qualquer outra função. Por exemplo, uma função destinada a um construtor usa uma vinculação global para o valor de this quando invocada de maneira independente:

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

É convencional usar letra maiúscula no primeiro caractere do identificador de uma função construtora, seguindo o padrão de nomenclatura estabelecido pelas funções de fábrica integradas do JavaScript. Embora às vezes você possa ver os termos usados como sinônimos, as funções de construtor, que são funções destinadas a agir em um objeto recém-construído, quando invocadas com a palavra-chave new, diferem das "funções de fábrica", que explicitamente return um objeto quando são invocadas normalmente:

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

myObject;
> Object { myProperty: true }

Embora os princípios subjacentes sejam os mesmos, os casos de uso para funções de construtor personalizadas são mais bem atendidos pela sintaxe Class mais completa introduzida no ES6.