Ключевое слово new в js

Как работает ключевое слово new?

Сделал несколько тестов, но ничего толкового не узнал.

Все началось с этого кода который я нашел.

const
    pattern = ['A','B'],
    times = 5,
    result = Array(times).fill(pattern).flat();

console.log(...result); // A B A B A B A B A B

Почему тут не используется ключевое слово new? Из любопытства я использовал, но результат не изменился.

const
    pattern = ['A','B'],
    times = 5,
    result = new Array(times).fill(pattern).flat();

console.log(...result); // A B A B A B A B A B -> тоже самое что и наверху

Забавно.

Вот еще тесты.

const a = new Array(); // -> a === []
const b = new Array; // -> b === []
const c = Array(); // -> c === []

Как это работает?


Ответы (1 шт):

Автор решения: Pavel Grishaev

Обычные функции могут создавать объекты. Если эти функции назвать с большой буквы, то они будут выглядеть как класс. Им не нужен new для работы, они и так создают объект, например так:

function MyObject(){
    return { isMySuperObject: true };
}

А вот функция-класс, которой требуется new для создания точно такого же объекта:

function MyObject(){
    this.isMySuperObject = true;
}

Так же работает функция Array. Или например стандартная функция Error, которую можно писать с new или без него, в любом случае она создаёт объект ошибки.

Но не все функции работают одинаково в режиме класса или простой функции. Могут быть нюансы или большие различия. Например стандартная функция Date без new возвращает строку даты, а с new - объект даты.

new всегда означает, что в результате будет экземпляр данного класса, то есть объект. А не примитивное значение вроде строки или числа. Потому что именно new создаёт новый объект, а функция справа от него наполняет этот объект свойствами.

В отличие от этого, функция, не важно с какой буквы написанная, может вернуть что угодно, а не только объекты.

P.S. Массивы - это объекты. Не совсем, но обычно так говорят, имея в виду что они "передаются по ссылке" как объекты и тоже ведут себя как коробочка со свойствами.

→ Ссылка