Ключевое слово 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 шт):
Обычные функции могут создавать объекты. Если эти функции назвать с большой буквы, то они будут выглядеть как класс. Им не нужен new для работы, они и так создают объект, например так:
function MyObject(){
return { isMySuperObject: true };
}
А вот функция-класс, которой требуется new для создания точно такого же объекта:
function MyObject(){
this.isMySuperObject = true;
}
Так же работает функция Array. Или например стандартная функция Error, которую можно писать с new или без него, в любом случае она создаёт объект ошибки.
Но не все функции работают одинаково в режиме класса или простой функции. Могут быть нюансы или большие различия. Например стандартная функция Date без new возвращает строку даты, а с new - объект даты.
new всегда означает, что в результате будет экземпляр данного класса, то есть объект. А не примитивное значение вроде строки или числа. Потому что именно new создаёт новый объект, а функция справа от него наполняет этот объект свойствами.
В отличие от этого, функция, не важно с какой буквы написанная, может вернуть что угодно, а не только объекты.
P.S. Массивы - это объекты. Не совсем, но обычно так говорят, имея в виду что они "передаются по ссылке" как объекты и тоже ведут себя как коробочка со свойствами.