Javascript `new` ключевое слово в функции, возвращающей массив - PullRequest
6 голосов
/ 27 июня 2011

Я экспериментировал с ключевым словом new и не могу найти объяснение этому поведению.Допустим, у нас есть функция, возвращающая целое число:

(в firebug)

>>> function x() { return 2; }
>>> x()
2
>>> new x()
x { }

Но если функция возвращает массив:

>>> function y() { return [2]; }
>>> y()
[2]
>>> new y()
[2]

Почему это так?

Ответы [ 2 ]

16 голосов
/ 27 июня 2011

Оператор new имеет интересное поведение: он возвращает объект, созданный оператором, если функция конструктора не возвращает другой объект.Любое необъектное возвращаемое значение функции конструктора игнорируется, поэтому, когда вы возвращаете 2, вы этого не видите.

Вот что происходит, когда вы говорите new x():

  1. Интерпретатор создает новый пустой объект.
  2. Он устанавливает базовый прототип объекта на x.prototype.
  3. Он вызывает x с this, установленным для нового объекта.
  4. В обычном случае x ничего не возвращает, и результатом выражения new является новый объект, созданный на шаге 1. Но , если x возвращаетне null ссылка на объект , тогда эта ссылка на объект является результатом выражения new, а не объекта, созданного на шаге 1. Любой другой тип возвращаемого значения (null, примитивные числа, примитивные строки, undefined и т. д.) игнорируется;это должна быть не null ссылка на объект, чтобы иметь приоритет над созданным объектом new.

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

Для некоторого легкого чтения (ха!) это покрыто Разделом 13.2.2 ( "[[Construct]]" ) спецификации( HTML ; PDF ), на который ссылается Раздел 11.2.2 ( "Оператор new" ).

5 голосов
/ 27 июня 2011

Поскольку массив - это объект, а 2 - нет.

Если вы вызываете функцию с ключевым словом new, она должна вернуть объект. Если вы не сделаете это явно, он автоматически вернет this (который является пустым объектом, который наследуется от funcName.prototype).

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