Что является возвращаемым значением функции конструктора ES2015? - PullRequest
0 голосов
/ 07 сентября 2018

Это был вопрос, который первоначально возник, потому что я пытался документировать класс ES2015 с помощью JSDoc и правильно документировать функцию конструктора класса, мне нужно было знать возвращаемое значение и его тип, и я понял, что понятия не имею , Исследуя его, я не смог найти вопрос, задаваемый по переполнению стека, поэтому я покопался в поисках деталей классов ES2015, нового оператора и функции конструктора. Я нашел то, что, по моему мнению, может быть ответом, но подумал, что было бы полезно опубликовать вопрос на SO вместе с тем, что я нашел, и посмотреть, смогут ли другие подтвердить или получить лучшие ответы.

Чтобы продемонстрировать вопрос, предположим, что у вас есть следующий код:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

var mySquare = new Rectangle(10, 10);
console.log(mySquare);//output: Object { height: 10, width: 10 }

Никто не может прямо или явно вызывать функцию конструктора и явно не возвращать что-либо из нее, но она явно вызывается и должна возвращать что-то . Итак, что такое возвращаемое значение функции конструктора? И какого типа это возвращаемое значение?

Чтобы усложнить задачу, нельзя просто вызвать конструктор и проверить тип возвращаемого значения, как я пытался сделать сначала:

console.log(typeof mySquare.constructor(11, 11));//output: TypeError: class constructors must be invoked with |new|
console.log(typeof Rectangle.prototype.constructor(12, 12));//output: TypeError: class constructors must be invoked with |new|

1 Ответ

0 голосов
/ 07 сентября 2018

Согласно справке MDN об операторе new :

Когда выполняется код new Foo (...), происходят следующие вещи:

  1. Создан новый объект, унаследованный от Foo.prototype.
  2. Функция конструктора Foo вызывается с указанными аргументами и с этим привязывается к вновь созданному объекту. new Foo эквивалентен new Foo (), т.е. если список аргументов не указан, Foo вызывается без аргументов.
  3. Объект, возвращаемый функцией-конструктором , становится результатом всего нового выражения. Если функция конструктора не возвращает явно объект , вместо него используется объект, созданный на шаге 1. (Обычно конструкторы не возвращают значение, но они могут сделать это, если хотят переопределить обычный процесс создания объекта.)

(Выделение мое.) Так что, похоже, возвращаемое значение функции конструктора - это объект, точнее экземпляр класса.

Дальнейшие исследования показали, что возвращаемое значение конструктора может быть переопределено путем явного возврата любого объекта из функции конструктора (хотя возвращаемые значения не-объекта будут игнорироваться, и в этом случае будет использоваться значение по умолчанию для вновь созданной ссылки на объект .) Я не смог найти ничего, что указывало бы на то, что конструкторы ES2015 отличаются от конструкторов до классов ES2015.

Этот пост переполнения стека был очень полезен при исследовании вышеупомянутого, в частности эта статья содержала ссылку на него, хотя constructor не появлялся в коде ни в вопрос или статья, с моим ограниченным пониманием конструкторов, что я собирался исследовать это, они, казалось, сначала не отвечали на мой вопрос. Надеюсь, что это может прояснить для других в той же ситуации.

Edit: достоверность информации MDN была поставлена ​​под сомнение в комментариях, поэтому я исследовал более точный источник. В спецификации ECMA говорится о конструкторах:

Конструктор - это объект, который поддерживает внутренний метод [[Construct]].

Внутренний метод [[Construct]] затем определяется следующим образом :

Подпись: (Список любых, Объект) → Объект

Описание: Создает объект. Вызывается через новых или супер операторов. Первый аргумент внутреннего метода - это список, содержащий аргументы оператора. Второй аргумент - это объект, к которому изначально был применен новый оператор. Объекты, которые реализуют этот внутренний метод, называются конструкторами. Функциональный объект не обязательно является конструктором, и такие не-конструкторские функциональные объекты не имеют внутреннего метода [[Construct]].

В спецификации говорится, что при описании подписей, таких как приведенная выше, используется следующее соглашение : «Если внутренний метод явно возвращает значение, за его списком параметров следует символ« → »и имя типа возвращаемого значения. "

Итак, чтобы подвести итог, основываясь на спецификации ECMA, как указано выше, да, функции конструктора действительно возвращают объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...