Согласно справке MDN об операторе new
:
Когда выполняется код new Foo (...), происходят следующие вещи:
- Создан новый объект, унаследованный от Foo.prototype.
- Функция конструктора Foo вызывается с указанными аргументами и с этим привязывается к вновь созданному объекту. new Foo эквивалентен new Foo (), т.е. если список аргументов не указан, Foo вызывается без аргументов.
- Объект, возвращаемый функцией-конструктором , становится результатом всего нового выражения. Если функция конструктора не возвращает явно объект , вместо него используется объект, созданный на шаге 1. (Обычно конструкторы не возвращают значение, но они могут сделать это, если хотят переопределить обычный процесс создания объекта.)
(Выделение мое.) Так что, похоже, возвращаемое значение функции конструктора - это объект, точнее экземпляр класса.
Дальнейшие исследования показали, что возвращаемое значение конструктора может быть переопределено путем явного возврата любого объекта из функции конструктора (хотя возвращаемые значения не-объекта будут игнорироваться, и в этом случае будет использоваться значение по умолчанию для вновь созданной ссылки на объект .) Я не смог найти ничего, что указывало бы на то, что конструкторы ES2015 отличаются от конструкторов до классов ES2015.
Этот пост переполнения стека был очень полезен при исследовании вышеупомянутого, в частности эта статья содержала ссылку на него, хотя constructor
не появлялся в коде ни в вопрос или статья, с моим ограниченным пониманием конструкторов, что я собирался исследовать это, они, казалось, сначала не отвечали на мой вопрос. Надеюсь, что это может прояснить для других в той же ситуации.
Edit: достоверность информации MDN была поставлена под сомнение в комментариях, поэтому я исследовал более точный источник. В спецификации ECMA говорится о конструкторах:
Конструктор - это объект, который поддерживает внутренний метод [[Construct]].
Внутренний метод [[Construct]]
затем определяется следующим образом :
Подпись: (Список любых, Объект) → Объект
Описание: Создает объект. Вызывается через новых или супер операторов. Первый аргумент внутреннего метода - это список, содержащий аргументы оператора. Второй аргумент - это объект, к которому изначально был применен новый оператор. Объекты, которые реализуют этот внутренний метод, называются конструкторами. Функциональный объект не обязательно является конструктором, и такие не-конструкторские функциональные объекты не имеют внутреннего метода [[Construct]].
В спецификации говорится, что при описании подписей, таких как приведенная выше, используется следующее соглашение : «Если внутренний метод явно возвращает значение, за его списком параметров следует символ« → »и имя типа возвращаемого значения. "
Итак, чтобы подвести итог, основываясь на спецификации ECMA, как указано выше, да, функции конструктора действительно возвращают объекты.