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
暂未整理: