JavaScript: использование конструктора без 'нового' оператора

Помогите мне понять, почему следующий код работает:


В первой строке существует нет new оператор.

Насколько я знаю, конструктор в JavaScript является функцией, которые инициализируют объекты, созданные оператором new и они не предназначены для возврата чего-либо.

27
задан GetFree 24 September 2012 в 12:51
поделиться

2 ответа

В общем, если что-то задокументировано как конструктор, используйте с ним new . Но в этом случае RegExp имеет определенное «фабричное» поведение для ситуации, когда вы вызывали его как функцию. См. Раздел 15.10.3 спецификации ECMAScript (JavaScript) (ссылка на исходящую спецификацию; номер раздела такой же в новой спецификации, которую вы можете загрузить с главной страницы ECMA [с правой стороны]; я не хочу напрямую ссылаться на файл PDF размером ~ 4 МБ):

15.10.3 Конструктор RegExp, вызываемый как функция
15.10.3.1 RegExp (шаблон, flags)
Если шаблон - это объект R, свойство [[Class]] которого равно «RegExp», а flags не определен, то вернуть R без изменений. В противном случае вызовите конструктор RegExp (15.10.4.

36
ответ дан 28 November 2019 в 05:16
поделиться

+1 У Т.Дж. Краудера. Стандарт ECMAScript старается изо всех сил определять поведение встроенных функций конструктора при вызове как простых функций. Часто он просто вызывает себя как конструктор, но бывают более сложные случаи.

конструкторы в javascript [...] не предназначены для возврата чего-либо

В общем, конструктор может игнорируйте this и просто верните независимый объект:

function Thing() {
    return {'foo': 1};
}

в этом случае вы можете в равной степени использовать функцию как конструктор (с new ) или обычную функцию.

Если конструктор ничего не возвращает, как это обычно бывает с конструкторами, оператор new сам гарантирует, что он возвращает новый объект, созданный и переданный как this . В этом случае вы должны использовать новый .

It '

10
ответ дан 28 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: