ActionScript3 Proxy学习使用
ActionScript3文档中对Proxy的描述:
Proxy 类用于覆盖对象的 ActionScript 操作(如检索和修改属性)的默认行为。
Proxy 类没有构造函数,您不应尝试实例化 Proxy。 而是应使用 Proxy 类的子类来覆盖诸如 getProperty 之类的方法并提供自定义行为。 如果尝试使用 Proxy 类的某个方法而不覆盖该方法,则会引发异常。
同时请记住,您自己的用于覆盖 Proxy 类的方法的代码也可能会意外引发异常。 在使用这些方法时引发异常会导致问题,因为调用代码(使用诸如 in、is 和 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
暂未整理:
浙公网安备 33010602011771号