globalプロパティというのをすっかり忘れてた。というだけの話。
// フラグを設定せずに定数的な扱いにしておく
var PATTERN = /[a-z]/
// これだといかん
'abc'.replace(new RegExp(PATTERN, 'g'), '*'); // TypeError発生
// これならOK
PATTERN.global = true;
'abc'.replace(PATTERN, '*');
// ちなみにこれはエラーにならない(無駄だけど)
'abc'.replace(new RegExp(PATTERN), '*');
Chromeの場合Cannot supply flags when constructing one RegExp from another
というエラーを吐く。
コンストラクタで正規表現オブジェクトを生成するときにはフラグの上書きができないらしい。
http://ja.scribd.com/doc/86478034/22/new-RegExp-pattern-flags-§15-10-4-1
しかしそもそも
PATTERN.global = true;
これって完璧にプロパティを破壊的に変更しているので、定数的にしてる意味ないよね。プリミティブ値じゃないのを定数的に扱おうとしてること自体ナンセンスだったよね。
というメモでした。