在建構式中傳入要聚合的物件,
參數越後面的,優先序越高。
Aggregation
package tw.right929.proxy
{
import flash.utils.Proxy;
import flash.utils.flash_proxy;
use namespace flash_proxy
/**
* 方便使用聚合的物件。
* 在建構式中傳入要聚合的物件,
* 參數越後面的,優先序越高。
*/
public dynamic class Aggregation extends Proxy
{
private var _collection:Array = new Array();
public function Aggregation(...objects)
{
super();
_collection.push.apply(_collection , objects);
}
/**
* 尋找聚合物件之中是否有這個屬性。
*/
override flash_proxy function hasProperty(name:*):Boolean
{
for(var i:int = _collection.length-1 ; i>=0 ; i--)
{
if(_collection[i].hasOwnProperty(name))
return true;
}
return false;
}
/**
* 不能增加新的屬性,只能設定已存在聚合物件中的屬性。
*/
override flash_proxy function setProperty(name:*, value:*):void
{
for(var i:int = _collection.length-1 ; i>=0 ; i--)
{
if(_collection[i].hasOwnProperty(name))
{
if(_collection[i][name] == value)
return;
_collection[i][name] = value;
return;
}
}
}
/**
* 傳回已存在聚合物件之中的屬性。
*/
override flash_proxy function getProperty(name:*):*
{
for(var i:int = _collection.length-1 ; i>=0 ; i--)
{
if(_collection[i].hasOwnProperty(name))
return _collection[i][name];
}
return undefined;
}
/**
* 呼叫聚合物件之中的方法。
*/
override flash_proxy function callProperty(name:*, ... rest):*
{
for(var i:int = _collection.length-1 ; i>=0 ; i--)
{
if(_collection[i].hasOwnProperty(name))
return _collection[i][name].apply(this , rest);
}
return undefined;
}
}
}
測試<?xml version="1.0" encoding="utf-8"?>
<s:Application creationComplete="init()" xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768">
<fx:Script>
<![CDATA[
import tw.right929.proxy.AdvancedProxy;
import tw.right929.proxy.Aggregation;
private function init():void
{
var childArr:Array = [];
var itemArr:Array = [];
var point:Point = new Point(0 , 0);
var childProxy:AdvancedProxy = new AdvancedProxy();
childProxy.$super = childArr;
childProxy.$alias("push" , "addChild");
var itemProxy:AdvancedProxy = new AdvancedProxy();
itemProxy.$super = itemArr;
itemProxy.$alias("push" , "addItem");
var agg:Aggregation = new Aggregation(childProxy , itemProxy , point);
agg.addChild("c1" , "c2");
agg.addItem("i1" , "i2");
agg.x = 10;
agg.y = 20;
trace(childArr);
trace(itemArr);
trace(point.x);
trace(point.y);
trace(agg.x);
trace(agg.y);
}
]]>
</fx:Script>
</s:Application>
沒有留言:
張貼留言