昨日電車の中で『JavaScript Ninjaの極意』を読んでいてなるほどと思ったこと。予めことわっておきますが、書評とかそういうのではありません。
『JavaScript Ninjaの極意』「第4章 関数を使いこなす」の「リスト4-15 メソッドを多重定義する関数」になるほどと思ったので覚え書き。次に引用します。
リスト4-15 メソッドを多重定義する関数
function addMethod(object, name, fn) { var old = object[name]; object[name] = function(){ if (fn.length == arguments.length) return fn.apply(this, arguments); else if (typeof old == 'function') return old.apply(this, arguments); }; }
次が用例。
var ninja = {}; addMethod(ninja, 'whatever', function(){ /* あることを行う */ }); addMethod(ninja, 'whatever', function(a){ /* 別のことを行う */ }); addMethod(ninja, 'whatever', function(a, b){ /* また別のことを行う */ });
「リスト4-15 メソッドを多重定義する関数」2行目で前回登録したクロージャ参照を保持しておき、6,7行目で新たに今回登録されるクロージャ内でこれを参照しています。言わばクロージャによるクロージャ自身の連結リストとも言えるもので、ちょっと感心してしまいました。