JavaScript: использование конструктора без оператора 'new'
Пожалуйста, помогите мне понять, почему работает следующий код:
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
В первой строке нет new
оператор.
Насколько я знаю, конструктор в JavaScript - это функция, которая инициализирует объекты, созданные оператором. new
и они не должны ничего возвращать.
2 ответа
В общем, если что-то задокументировано как конструктор, используйте new
с этим. Но в этом случае RegExp
имеет определенное "фабричное" поведение для ситуации, когда вы вызываете его как функцию. См. Раздел 15.10.3 спецификации ECMAScript (JavaScript) (который ссылается на исходящую спецификацию; номер раздела такой же, как и в новой спецификации, которую вы можете загрузить с главной страницы ECMA [с правой стороны]; I не хочу напрямую ссылаться на файл PDF размером ~ 4 МБ):
15.10.3. Конструктор RegExp, вызываемый как функция
15.10.3.1 RegExp(pattern, flags)
Если pattern - это объект R, у которого свойство [[Class]] равно "RegExp" и флаги не определены, то вернуть R без изменений. В противном случае вызовите конструктор RegExp (15.10.4.1), передав ему шаблон и аргументы флагов, и верните объект, созданный этим конструктором.
Вы можете определить свои собственные функции конструктора JavaScript, чтобы пропустить new
ключевое слово (обнаруживая, что они были вызваны как функции, а также поворачиваясь и вызывая себя правильно), но я бы не советовал его, поскольку это приводит к вводящему в заблуждение коду.
+1 TJ Crowder это имеет. Стандарт ECMAScript делает все возможное, чтобы определить поведение встроенных функций конструктора при вызове в виде простых функций. Часто он просто вызывает себя как конструктор, но есть и более сложные случаи.
конструкторы в javascript [...] не должны ничего возвращать
В общем, конструктор может игнорировать this
и просто вернуть независимый объект:
function Thing() {
return {'foo': 1};
}
в этом случае вы можете в равной степени использовать функцию в качестве конструктора (с new
) или простая функция.
Если конструктор ничего не возвращает, как это обычно делается для конструкторов, new
сам оператор гарантирует, что он возвращает новый объект, созданный и переданный как this
, В этом случае вы должны использовать new
,
Лучше не полагаться на конструктор, работающий как голая функция, а альтернативные варианты поведения встроенных конструкторов редко бывают полезны, поэтому обычно следует придерживаться new
,