Wywołanie funkcji za pomocą funkcji new
powoduje utworzenie nowego obiektu za pomocą wywołanej funkcji jako
czyli „konstruktora”. dla tego obiektu:
function MyFunction() {}
const myObject = new MyFunction();
typeof myObject;
> "object"`
Dzięki temu „funkcja konstruktora” udostępnić szablon do tworzenia obiekty o tym samym wzorcu strukturalnym:
function MyFunction() {
this.myProperty = true;
}
const myObject = new MyFunction();
myObject.myProperty;
> true
Wartość this
w konstruktorze
funkcja odnosi się do tworzonego obiektu, umożliwiając wypełnienie obiektu
z właściwościami i metodami w momencie tworzenia. Dzięki temu
tworzenia obiektów zawierających wartości danych i wszystkich metod niezbędnych do
te dane jako pojedynczą jednostkę przenośną, czyli pojęcie „enkapsulacja”:
function MyFunction( myArgument ) {
this.myValue = myArgument;
this.doubleMyValue = () => myArgument * 2;
}
const myObject = new MyFunction( 10 );
myObject.myValue;
> 10
myObject.doubleMyValue();
> 20
this
odnosi się do bieżącego wykonania
kontekstu funkcji, co oznacza, że funkcja konstruktora działa tak samo
dla wartości this
tak jak w przypadku każdej innej funkcji. Na przykład funkcja
jako konstruktor używa powiązania globalnego
dla wartości this
po wywołaniu niezależnie:
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
Zgodnie z konwencją pierwszy znak identyfikatora funkcji konstruktora jest zapisywany wielkimi literami zgodnie ze wzorcem nazw zastosowanym w domyślnych funkcjach fabrycznych w JavaScript. Choć terminy mogą być niekiedy używane zamiennie,
funkcje konstruktora, czyli funkcje działające na nowo zbudowanym
po wywołaniu ze słowem kluczowym new
– różni się od „factory”
funkcji”, co jednoznacznie return
przy normalnym wywołaniu:
function myFunction( myArgument = false ) {
return { "myProperty" : myArgument };
}
const myObject = myFunction( true );
myObject;
> Object { myProperty: true }
Chociaż podstawy są takie same, w przypadku zastosowania funkcje konstruktora są lepiej obsługiwane przez pełniejsze funkcje Wprowadzono składnię klasy w ES6.