特異メソッド(?)の定義

var obj:Object = {x:100, y:100};
trace( "obj=", obj );  // #=> obj= [Object object]
obj.toString = function():String{
  return obj.x + ", " + obj.y;
}
trace( "obj=", obj );  // #=> obj= 100, 100

あるインスタンスにだけ有効なメソッドのふるまいを動的に定義することができる。

setter, getter

public class Klass{
 
  private var prop:String;
 
  public function Klass(){};
 
  // セッター
  public function set prop(str:String):void{
     if( str == "" ) str = "i was blank";
     prop = str;
  }
 
  // ゲッター
   public function get prop():String{
      if( prop == "i was blank" ) return "";
      return prop;
   }
}
 
var k:Klass = new Klass();
k.prop = "str";
trace( k.prop ); // "str"
k.prop = "i was blank";
trace( k.prop ); // ""

set, getを使うことで、publicなフィールド(インスタンス変数)と同じように、Class#property_nameで代入や取得ができるようになるという話。

もちろん、setProp(), getProp()のようなメソッドを実装しても全く問題はない。

Singleton

AS3では、privateなコンストラクタはサポートされていない。FlexBuilder3では、「1153: コンストラクタはpublicとしてのみ宣言できます。」とけっこう素っ気なく言われてしまう。そこで、だ。Singletonにしたいクラスと同じソース内で、publicではないクラスHiddenを宣言し、コンストラクタの引数に、Hiddenのインスタンスを受け取るようにすると、外部からnewでインスタンスを生成できなくなる。

package com.example.singleton {
  public class MySingleTon {
    private static var _self:MySingleton;
 
    public static getInstance():MySingleton{
      if( _self == null ){
        _self = new MySingleton( new Hidden() );
      }
      return _self;
    }
 
    public function MySingleTon(hidden:Hidden){}
  }
}
 
class Hidden {}
最終更新:2008年05月31日 15:31