Chamar uma função com new
cria um novo objeto usando a função chamada como
o "construtor" para esse objeto:
function MyFunction() {}
const myObject = new MyFunction();
typeof myObject;
> "object"`
Isso permite que uma "função de construtor" fornecer 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 um construtor
refere-se ao objeto que está sendo criado, permitindo que o objeto seja preenchido
com propriedades e métodos no momento da criação. Isso permite que
criação de objetos que contêm valores de dados e quaisquer métodos necessários para agir
os 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
refere-se à execução atual.
contexto de uma função, o que significa que uma função construtora segue a mesma
regras para o valor de this
como qualquer outra função. Por exemplo, uma função
pretendido como um construtor usa a vinculação global
para o valor de this
quando invocado 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 colocar em maiúscula o primeiro caractere do nome de uma função de construtor
de e-mail, seguindo o padrão de nomenclatura estabelecido pela API do JavaScript
de fábrica. Embora às vezes você veja os termos usados como sinônimos,
funções de construtor, funções destinadas a atuar em um objeto recém-construído
objeto quando invocado com a palavra-chave new
. Os valores são diferentes
funções", o que explicitamente return
um
quando invocado normalmente:
function myFunction( myArgument = false ) {
return { "myProperty" : myArgument };
}
const myObject = myFunction( true );
myObject;
> Object { myProperty: true }
Embora os princípios básicos sejam os mesmos, os casos de uso de funções de construtor personalizadas são melhor atendidos pela sintaxe de Classe mais completa introduzida no ES6.