Поскольку я по существу пытался ответить на этот вопрос во всех моих комментариях, давайте подытожим все, что мы уже рассмотрели, в реальном ответе.
Когда вы сделаете это:
var r = /^[0-9A-Z]$/.test;
Вы назначаете метод с именем test
из объекта RegExp
переменной с именем r
.Это просто метод назначения.Нет никакой связи с конкретным объектом регулярного выражения, который вы создали.Если это так, r == RegExp.prototype.test
.
Когда вы затем попробуете эту строку кода:
r("A")
вы пытаетесь выполнить RegExp.prototype.test
и передать его "A"
, но у вас нетсоответствующий контекст объекта.Когда запускается тестовая функция, указатель this
не будет указывать на объект регулярного выражения, он будет указывать на глобальный объект (который в браузере является объектом window
).
В вашем oПример кода a и b работает, потому что все, что вы делаете - это вызываете функции, которые не ссылаются на данные экземпляра, а указатель this вообще не используется (поэтому не имеет значения, что для него не установлен соответствующий контекст объекта),Это не относится к методу регулярных выражений.Ему нужны данные экземпляра (например, указатель this
для указания на реальный объект регулярного выражения).
Можно взять точку метода и добавить соответствующий указатель this
, хотя я понятия не имеюпочему это было бы полезно в этом конкретном примере.Например, вы можете сделать это:
var re = /^[0-9A-Z]$/;
var r = re.test;
r.call(re);
, который устанавливает указатель this
на ваш объект регулярного выражения, а затем выполняет метод r
с указателем this
.
Я действительно не знаю, почему вы хотите это сделать, но, надеюсь, это поможет объяснить все.