Помогите мне понять, почему следующий код работает:
В первой строке существует нет new
оператор.
Насколько я знаю, конструктор в JavaScript является функцией, которые инициализируют объекты, созданные оператором new
и они не предназначены для возврата чего-либо.
В общем, если что-то задокументировано как конструктор, используйте с ним 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.
+1 У Т.Дж. Краудера. Стандарт ECMAScript старается изо всех сил определять поведение встроенных функций конструктора при вызове как простых функций. Часто он просто вызывает себя как конструктор, но бывают более сложные случаи.
конструкторы в javascript [...] не предназначены для возврата чего-либо
В общем, конструктор может игнорируйте this
и просто верните независимый объект:
function Thing() {
return {'foo': 1};
}
в этом случае вы можете в равной степени использовать функцию как конструктор (с new
) или обычную функцию.
Если конструктор ничего не возвращает, как это обычно бывает с конструкторами, оператор new
сам гарантирует, что он возвращает новый объект, созданный и переданный как this
. В этом случае вы должны использовать новый
.
It '