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,

Другие вопросы по тегам