クロージャによるクロージャ自身の連結リスト(JavaScript)

昨日電車の中で『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行目で新たに今回登録されるクロージャ内でこれを参照しています。言わばクロージャによるクロージャ自身の連結リストとも言えるもので、ちょっと感心してしまいました。