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):* 允许按索引编号枚举代理对象的属性以检索属性值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 |
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 |
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
ActionScript3 Proxy学习使用,布布扣,bubuko.com
原文:http://www.cnblogs.com/jsncz/p/3633630.html