委譲(2)
委譲*1の続き.少しだけ変更してみました.
Object.prototype.delegator = function(accessor, methodName, aliasName) { if(!aliasName) aliasName = methodName; if (typeof accessor == "string") { this[aliasName] = function(){ this[accessor][methodName].apply(this[accessor], arguments); } } else { this[aliasName] = function(){ accessor[methodName].apply(accessor, arguments); } } }
第一引数が String 型の場合は,今まで通りその名前のプロパティに入ってるオブジェクトに処理を委譲しますが,String 型以外の物が渡された場合はそのオブジェクト自体に処理を委譲するようにしてみました.
以下使い方.
// test Object#delegator() var helloObj = new Object(); helloObj.printMessage = function() { alert("Hello, world") } var obj = new Object(); obj.delegator(helloObj, "printMessage"); // helloObj に委譲 obj.printMessage(); // "Hello, world"
String 型以外を渡した場合,そのオブジェクトに直接委譲してくれるので,プロパティにオブジェクトを設定する必要がなくなります.そのかわりに後から委譲先を差し替えることができなくなります.
これだと委譲先のオブジェクトから Function オブジェクトの入っているプロパティをコピーするのとあまり差がない気がしますが,委譲先のオブジェクトのメソッドを書き換えた場合に反映されるのでコピーするよりは柔軟です.
ある程度動的なプログラミング言語の場合,委譲メソッドが簡単に定義できるなら実装の多重継承のための特別な機構はなくても困らないかなぁ…とか最近なんとなく思ってます…*2
「String オブジェクト」を「String 型」に修正
*1:http://d.hatena.ne.jp/sa-y/20060326#1143374652
*2:性能の問題があるかもしれませんが.