Новое ключевое слово

Вызов функции с помощью new создает новый объект, используя вызываемую функцию в качестве «конструктора» для этого объекта:

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

typeof myObject;
> "object"`

Это позволяет «функции-конструктору» предоставлять шаблон для создания объектов, которые следуют одному и тому же структурному шаблону:

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

myObject.myProperty;
> true

Значение this в функции-конструкторе относится к создаваемому объекту, позволяя наполнять объект свойствами и методами во время создания. Это позволяет создавать объекты, содержащие значения данных и любые методы, необходимые для работы с этими данными как единую переносимую единицу. Эта концепция называется «инкапсуляцией»:

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

myObject.myValue;
> 10

myObject.doubleMyValue();
> 20

this относится к текущему контексту выполнения функции, а это означает, что функция-конструктор следует тем же правилам для значения this , что и любая другая функция. Например, функция, предназначенная как конструктор, использует глобальную привязку значения this при независимом вызове:

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

Традиционно первый символ идентификатора функции-конструктора пишется с заглавной буквы, следуя шаблону именования, установленному встроенными фабричными функциями JavaScript. Хотя иногда вы можете увидеть термины, используемые как взаимозаменяемые, функции-конструкторы — функции, предназначенные для воздействия на вновь созданный объект при вызове с ключевым словом new — отличаются от «фабричных функций», которые явно return объект при обычном вызове:

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

myObject;
> Object { myProperty: true }

Хотя базовые принципы одинаковы, варианты использования пользовательских функций-конструкторов лучше обслуживаются более полнофункциональным синтаксисом классов , представленным в ES6.