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
あるインスタンスにだけ有効なメソッドのふるまいを動的に定義することができる。
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()のようなメソッドを実装しても全く問題はない。
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 {}