Pot.js と PotLite.js で利用可能。
object の関数をオーバーライドします。
引数 object が持つ関数 properties を、関数 overrider でオーバーライドします。
引数 object は、オーバーライドしたい関数をもつ親オブジェクトを指定します。
引数 properties は、オーバーライドする関数名を文字列または正規表現で指定、
または複数の関数を対象とし、配列で指定します。
引数 overrider は、オーバーライドする関数を渡します。
引数 converters が渡されると、対象の関数のコードを converters 通りに置換します。
overrider もしくは converters が必須です。
overrider と converters の両方を指定することも可能です。
properties が正規表現または配列の場合、複数の関数をオーバーライドします。
overrider に渡される引数は以下の 4 つです。
function (inherits, args, self, prop) {} - inherits : {Function} オリジナルの関数。 - args : {Arguments} オリジナルの引数。 - self : {Object} オリジナルの関数の 'this'。 - prop : {String} 対象の関数名。
converters を指定する場合、置換パターンと結果文字列で構成された配列で渡します。
例えば、[/\breturn\b\s*([^;]+);/, 'throw $1;']
を指定すると
オーバーライドする関数は return する代わりに それを throw する動作になります。
複数のパターンを指定する場合は、上のようなペアを複数持つ配列を渡します。
converters と overrider の両方が指定された場合、
converters によるコード置換が適応された後に overrider によりオーバーライドされます。
また、converters で置換する際には
コード内のコメントが除去されたり式が最適化されるかもしれません。
実行環境により差が出てしまうので、実行結果が意図した結果かどうか、注意してください。
関数がオーバーライドされた object が返ります。
// overrider のみ指定した例 var Hoge = { addHoge : function(value) { return value + 'hoge'; } }; debug(Hoge.addHoge('fugafuga')); // 'fugafugahoge' override(Hoge, 'addHoge', function(inherits, args, self, prop) { // オリジナルの関数の引数の 0 番目の値 var value = args[0]; // 引数を 以下のように変更 var modify = '{{Modified:' + value + '}}'; // 元の引数を消す args[0] = ''; // 先頭に追加してオリジナルの関数を呼び出す return modify + inherits(args); }); var result = Hoge.addHoge('fugafuga'); debug(result); // '{{Modified:fugafuga}}hoge'
// converters を指定する例 var Numbers = { NAME : 'Numbers', logAdd : function(a, b) { return this.NAME + ':' + (a + b); } }; debug(Numbers.logAdd(1, 2)); // 'Numbers:3' override(Numbers, 'logAdd', [[ /\bthis\.NAME\b/, // this.NAME を "Result" に置換 '"Result"' ], [ /(["']):(['"])/, // ':' を ' = ' に置換 '$1 = $2' ], [ /\ba\s*[+]\s*b\b/, // + を * に置換し最後に * 100 を追加 '(a * b * 100)' ]]); debug(Numbers.logAdd(1, 2)); // 'Result = 200'
// converters と overrider の両方を指定する例 var Numbers = { NAME : 'Numbers', logAdd : function(a, b) { return this.NAME + ':' + (a + b); } }; debug(Numbers.logAdd(1, 2)); // 'Numbers:3' override(Numbers, 'logAdd', [ // 「this.NAME + ':' +」 を 「"(*l_l)/"」 に置換 /this\.NAME\s*[+]\s*([()])?\s*["']:['"]\s*[+]/, '"(*l_l)/"+$1' ], function(inherits, args, self, prop) { // 引数 a と b を取得 var a = args[0], b = args[1]; // 引数 a と b に 100 足して渡す return '{{' + inherits(a + 100, b + 100) + '}}'; }); debug(Numbers.logAdd(1, 2)); // '{{(*l_l)/203}}'