ObjectProxyでオブジェクトの属性変更を監視するサンプル
ObjectProxyを使うとオブジェクトの属性変更を監視する仕組みがさくっと作れます。使い方は以下の通り。
- 監視するオブジェクトを作成。
- 作成したオブジェクトを引数として、ObjectProxyを作成してラップ。
- 「addEventListener()」でObjectProxyに属性変更リスナを追加。
あとは、ObjectProxyに対して属性変更操作を行うと追加したリスナに変更が通知されます。ただし、Proxyなので監視対象のオブジェクト内部で属性を更新した場合(メソッドを呼び出して更新した場合など)、通知は行われないので注意。
package { import flash.display.*; import flash.text.*; import mx.events.*; import mx.utils.*; // ObjectProxyでオブジェクトの属性変更を監視するサンプル public class Sample extends Sprite { public function Sample(){ // 結果の表示用 var stdout:TextField = new TextField(); stdout.width = 500; stdout.height = 500; addChild(stdout); stdout.text = ""; // 監視対象のオブジェクト var mii:* = new Kitten("mii", 2); mii = new ObjectProxy(mii); // ObjectProxyでラップ // ObjectProxyに属性変更リスナを登録する mii.addEventListener( PropertyChangeEvent.PROPERTY_CHANGE, function(ev:PropertyChangeEvent):void{ // 属性が変更されたらテキストフィールドにキーと値を出力する。 stdout.text += <b>{ev.property} : {ev.newValue}</b>.toString() + "\n"; } ); // 属性を変更→リスナに通知される。 mii.name = "tora"; mii.age = 1; // もちろん、監視対象のオブジェクトの属性もちゃんと更新される。 stdout.text += "\n---\n"; stdout.text += mii.toString() + "\n"; // メソッド呼び出しで変更する場合など、 // 監視対象のクラス内で属性を変更するとリスナに通知されないので注意。 mii.setName("shiro"); mii.setAge(3); } } } /** * 監視対象とするクラス。 */ class Kitten { public var name:String; public var age:int; public function Kitten( name:String, age:int ) { this.name = name; this.age = age; } public function setName(name:String):void { this.name = name; } public function setAge(age:int):void { this.age = age; } public function toString():String { return name + ":" + age; } }