JavaScript | Оператор new

JavaScript | Оператор new

Семантика времени выполнения: оценка

NewExpression : new NewExpression

1. Вернуть ? EvaluateNew(NewExpression, empty).

MemberExpression : new MemberExpression Arguments

1. Вернуть ? EvaluateNew(MemberExpression, Arguments).

 

EvaluateNew ( constructExpr, arguments )

Абстрактная операция EvaluateNew принимает аргументы constructExpr и arguments. При вызове она выполняет следующие шаги:

1. Утверждено: constructExpr - это либо NewExpression, либо MemberExpression.
2. Утверждено: arguments либо пусто empty, либо Arguments.
3. Пусть ref будет результатом вычисления constructExpr.
4. Пусть constructor будет ? GetValue(ref).
5. Если arguments является empty, пусть argList будет новым пустым Списком.
6. Иначе,
   a. Пусть argList будет ? ArgumentListEvaluation из arguments.
7. Если IsConstructor(constructor) является false, выбросить исключение TypeError.
8. Вернуть ? Construct(constructor, argList).

 

Зачем нужен оператор new?

Создание объектов в JavaScript возможно при помощи двух вариантов:

  • через буквальную нотацию (via a literal notation)
  • через конструкторы (via constructors)

Создание нового объекта через функцию-конструктор необходимо для реализации наследования на основе прототипов (prototype-based inheritance) и общих свойств (shared properties). Объекты создаются с помощью конструкторов в выражениях new

Пример с датой — конструктор Date()

например, new Date (2021, 03) создает новый объект Date. Вызов конструктора без использования new имеет последствия, которые зависят от конструктора. Например, Date() создает строковое представление текущей даты и времени, а не объект.

Date(2021, 03)
// получим строку
"Thu Mar 25 2021 15:25:07 GMT+0300 (Москва, стандартное время)"

new Date(2021, 03)
// получим объект
Thu Apr 01 2021 00:00:00 GMT+0300 (Москва, стандартное время)
Строка Даты и Объект Даты - разные вещи - JavaScript
Строка Даты и Объект Даты — разные вещи — JavaScript

В результате, оператор new вернёт нам объект и мы сможем взаимодействовать с ним, как с экземпляром Date, то есть сможем вызывать методы для объектов-прототипов Date.

(new Date(2021, 03)).getFullYear()
2021
(new Date(2021, 03)).getMonth()
3
(new Date(2021, 03)).getDay()
4

Date(2021, 03).getFullYear()
VM5252:1 Uncaught TypeError: Date(...).getFullYear is not a function
at <anonymous>:1:16

 

Вывод в консоль браузера:

Без оператора new это просто строка и методы Date не работают - JavaScript
Без оператора new это просто строка и методы Date не работают — JavaScript

 

Пример с документом — конструктор DOMParser()

Есть строка:

`<a href="efim360.ru">Скачать фото</a>`

Попытка создания нового документа без оператора new потерпит неудачу.

DOMParser().parseFromString(`<a href="efim360.ru">Скачать фото</a>`, "text/html")

Ошибка создания нового документа без оператора new

Uncaught TypeError: Failed to construct ‘DOMParser’: Please use the ‘new’ operator, this DOM object constructor cannot be called as a function.
at <anonymous>:1:1

Ошибка создания документа из строки - JavaScript
Ошибка создания документа из строки — JavaScript

Исправить ситуацию можно только с оператором new

new DOMParser().parseFromString(`<a href="efim360.ru">Скачать фото</a>`, "text/html")
Создали новый объект документа из строки используя оператор new - JavaScript
Создали новый объект документа из строки используя оператор new — JavaScript

Подобных проблемных ситуаций может быть много. Это зависит от реализаций.

 

Информационные ссылки

Стандарт ECMAScript — Раздел «13.3.5 The new Operator» — https://tc39.es/ecma262/#sec-new-operator

Как преобразовать строку в HTML-элемент?