Является ли неявный метод JavaScript RegExp устаревшим? - PullRequest
2 голосов
/ 17 июня 2010

То есть все знают, что я имею в виду под "неявными методами"? Они как те свойства по умолчанию из прошлых дней Windows COM, где вы могли бы напечатать что-то вроде

val = obj(arguments)

и это будет интерпретироваться как

val = obj.defaultMethod(arguments)

Я только что узнал, что JavaScript имеет то же самое: метод по умолчанию для объекта RegExp выглядит как «exec», как в

/(\w{4})/('yip jump man')[1]
==> jump

Это работает даже тогда, когда объект RegExp назначен переменной, и даже когда он создается с помощью конструктора RegExp вместо /.../, что является хорошей новостью для нас поклонников ссылочной прозрачности.

Где это задокументировано и / или устарело?

Ответы [ 2 ]

6 голосов
/ 17 июня 2010

Эта функция нестандартная , некоторые реализации, такие как Mozilla (Spidermonkey и Rhino) и Google Chrome (V8), включают ее, но я бы крайне не одобрил ее использование,потому что это не является частью спецификации.

Эти реализации делают RegExp объекты вызываемыми , и вызов этих объектов эквивалентен вызову метода .exec.

В Chrome (и Firefox 2.x) даже при использовании оператора typeof с объектом RegExp вы получаете "function" (поскольку они реализуют внутренний метод [[Call]]).

typeof /foo/ == "function"; // true

Также ИМО Я не вижу преимущества использования:

regexp(str);

В сравнении:

regexp.exec(str);

Это немного задокументировано здесь от Mozilla.

0 голосов
/ 17 июня 2010

Ну, все функции являются объектами, так что вы можете сделать это:

var obj = function () {
    alert('Doing my default!');
};
obj.prop1 = 'Hello world';
obj.prop2 = function () {
    alert('Other method');
};

obj(); // 'Doing my default!'
alert(obj.prop1); // 'Hello world'
obj.prop2(); // 'Other method'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...