Оператор new
имеет интересное поведение: он возвращает объект, созданный оператором, если функция конструктора не возвращает другой объект.Любое необъектное возвращаемое значение функции конструктора игнорируется, поэтому, когда вы возвращаете 2
, вы этого не видите.
Вот что происходит, когда вы говорите new x()
:
- Интерпретатор создает новый пустой объект.
- Он устанавливает базовый прототип объекта на
x.prototype
. - Он вызывает
x
с this
, установленным для нового объекта. - В обычном случае
x
ничего не возвращает, и результатом выражения new
является новый объект, созданный на шаге 1. Но , если x
возвращаетне null
ссылка на объект , тогда эта ссылка на объект является результатом выражения new
, а не объекта, созданного на шаге 1. Любой другой тип возвращаемого значения (null
, примитивные числа, примитивные строки, undefined
и т. д.) игнорируется;это должна быть не null
ссылка на объект, чтобы иметь приоритет над созданным объектом new
.
Эта специальная обработка, предоставляемая ссылкам на объекты оператором new
, позволяет вам заменить другуюобъект для одного new
создан.Это может быть удобно в некоторых ограниченных ситуациях, но в большинстве случаев огромный , функция, предназначенная для использования с new
(называемая функцией конструктора ), не должна ничего возвращатьвообще.
Для некоторого легкого чтения (ха!) это покрыто Разделом 13.2.2 ( "[[Construct]]" ) спецификации( HTML ; PDF ), на который ссылается Раздел 11.2.2 ( "Оператор new
" ).