Семантика времени выполнения: оценка
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 (Москва, стандартное время)
В результате, оператор 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
Вывод в консоль браузера:
Пример с документом — конструктор 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
Исправить ситуацию можно только с оператором new
new DOMParser().parseFromString(`<a href="efim360.ru">Скачать фото</a>`, "text/html")
Подобных проблемных ситуаций может быть много. Это зависит от реализаций.
Информационные ссылки
Стандарт ECMAScript — Раздел «13.3.5 The new Operator» — https://tc39.es/ecma262/#sec-new-operator