Entries

Proxyクラスの新しい使い方を考えた

SmartDelegate.as

as3ライブラリの中で、「なんで存在するの?」とか、「ウンコ」とか、「DisplayObject継承できないから戦力外」とか不遇の扱いを受けまくるProxyクラスの活気的な使い方を考えてみた。

SmartDelegateクラスは内包した複数のオブジェクトに対して、まとめて委譲を行うクラスだ。


var obj1:Object = {name:"Taro", age:20, sex:"m"};
var obj2:Object = {name:"Jiro", age:18, sex:"m"};
var obj3:Object = {name:"Mika", age:15, sex:"f"};
var obj4:Object = {name:"Mari",  age:10, sex:"f"};

var sd:SmartDelegate = new SmartDelegate([obj1, obj2, obj3, obj4]);

sd.name = "Tom"; //全員名前がTomになる。
trace( sd.name ); //全員の名前が配列で返ってくる。
trace( sd.toString() ); //全員のtoString()の実行結果が配列で返ってくる。

といった具合に複数の対象のプロパティを同時に操作できる。本来オブジェクトの拡張に使うべきProxyクラスを、Delegateの基点としての用途に特化したところがポイント。

さらに、SmartDelegateクラスは第二引数に filter関数を持つことができる。


var obj1:Object = {name:"Taro", age:20, sex:"m"};
var obj2:Object = {name:"Jiro", age:18, sex:"m"};
var obj3:Object = {name:"Mika", age:15, sex:"f"};
var obj4:Object = {name:"Mari",  age:10, sex:"f"};

var sd:SmartDelegate = new SmartDelegate([obj1, obj2, obj3, obj4],
  function(obj:Object):Boolean{ return (obj.sex=="f")? true: false});

sd.name = "Sindy"; //全ての女性の名前がSindyになる。
sd.age = 18;         //全ての女性の年齢が18になる。
trace( sd.name );  //全ての女性の名前が配列で返ってくる。

といった具合に、特定の条件を満たした複数のアイテムに、プロパティと関数を委譲できる。
これを使うとどういうことができるか?

・画面外にある全てのMCをremoveChildする。
・ライフが0になった全てのキャラクターを処分する。
・条件を満たした全てのアイテムを変更する。

といった、条件が動的に変動する参照を保持することができるわけだ。
多分スゴイ便利。仕事の速度が10%ほどアップするはず。

ちょっとProxyを見直した。