ActionScript3 Proxy学习使用

ActionScript3文档中对Proxy的描述:

 

Proxy 类用于覆盖对象的 ActionScript 操作(如检索和修改属性)的默认行为。

Proxy 类没有构造函数,您不应尝试实例化 Proxy。 而是应使用 Proxy 类的子类来覆盖诸如 getProperty 之类的方法并提供自定义行为。 如果尝试使用 Proxy 类的某个方法而不覆盖该方法,则会引发异常。

同时请记住,您自己的用于覆盖 Proxy 类的方法的代码也可能会意外引发异常。 在使用这些方法时引发异常会导致问题,因为调用代码(使用诸如 inis 和 delete 等运算符)不应该有异常。 除非已经确信您的覆盖方法不会引发异常,否则 Adobe 建议在实现 Proxy 类的前后使用 try..catch 语句,以避免在运算符调用您的方法时出现致命错误。

Proxy 类取代了 ActionScript 2.0 的 Object.__resolve 和 Object.addProperty 功能,ActionScript 3.0 中不再提供这些功能。利用 Object.addProperty() 功能可以在 ActionScript 2.0 中动态地创建 get 和 set 方法。尽管 ActionScript 3.0 在编译时提供了 get 和 set 方法,但是,除非使用 Proxy 类,否则将无法动态地将某个方法分配给对象。

为了避免与 public 命名空间冲突,Proxy 类的方法位于 flash_proxy 命名空间中。

 

常用方法:

callProperty(name:*, ... rest):* 覆盖调用函数的方法。instance.fun();

deleteProperty(name:*):Boolean 覆盖删除属性的请求。 使用delete操作符调用。delete instance["p"];

getProperty(name:*):* 覆盖获取对象属性的方法。使用点操作符或者方括号操作符。 instance.p;, instance["p"];

setProperty(name:*, value:*):void 覆盖更改属性值的调用。instance["p"] = 1;

hasProperty(name:*):Boolean 覆盖请求以按名称来检查对象是否具有特定属性。

 

用于处理 for each, for in each 迭代的方法

nextName(index:int):String 允许按索引编号枚举代理对象的属性以检索属性名称。

nextNameIndex(index:int):int 允许按索引编号枚举代理对象的属性。

nextValue(index:int):* 允许按索引编号枚举代理对象的属性以检索属性值。

 

package
{
	import flash.utils.flash_proxy;
	import flash.utils.Proxy;
	
	/**
	 * ...
	 * @author wanghao
	 */
	public dynamic class ProxyArray extends Proxy
	{
		private var _item:Array;
		
		public function ProxyArray()
		{
			super();
			_item = new Array();
		}
			
		override flash_proxy function callProperty(methodName:*, ... args):*
		{
			var res:*;
			switch (methodName.toString())
			{
				case 'clear': 
					_item = new Array();
					break;
				case 'sum': 
					var sum:Number = 0;
					for each (var i:*in _item)
						if (!isNaN(i))
							sum += i;
					
					res = sum;
					break;
				default: 
					
					res = _item[methodName].apply(_item, args);
					break;
			}
			return res;
		}
		
		override flash_proxy function getProperty(name:*):*
		{
			return _item[name];
		}
		
		override flash_proxy function setProperty(name:*, value:*):void
		{
			_item[name] = value;
		}
			
	}
}

 

网友 rainssong 提供的例子

https://github.com/rainssong/RainsAsLib/blob/master/src/me/rainssong/utils/RevDictionary.as

package
{
	import flash.utils.Dictionary;
	import flash.utils.flash_proxy;
	import flash.utils.Proxy;

	/**
	 * ...
	 * @author Rainssong
	 */

	use namespace flash_proxy;

	public dynamic class RevDictionary extends Proxy
	{
		private var _dic:Dictionary;
		private var _revDic:Dictionary;
			
		public function RevDictionary(weakKeys:Boolean=false)
		{
			_dic = new Dictionary(weakKeys);
			_revDic = new Dictionary(weakKeys);
		}
			
		flash_proxy override function setProperty(name:*, value:*):void
		{
			_revDic[_dic[name]] = undefined;
			
			_dic[name] = value;
			
			_revDic[value] = name;
		}
			
		override flash_proxy function deleteProperty(name:*):Boolean 
		{
			_revDic[_dic[name]] = undefined;
			_dic[name] = undefined;
			return true;
		}
			
		override flash_proxy function getProperty(name:*):*
		{
			return _dic[name] ;
		}
			
		public function getRevValue(name:*):*
		{
			return _revDic[name] ;
		}

	}

}

 

参考:

http://bbs.9ria.com/thread-253320-1-1.html

暂未整理:

http://ltslashgt.com/2008/01/24/proxy-class-as3/

posted @ 2014-03-30 11:28  无声电影  阅读(330)  评论(0编辑  收藏  举报