首页 > 其他 > 详细

ActionScript3 Proxy学习使用

时间:2014-03-31 12:58:12      阅读:519      评论:0      收藏:0      [点我收藏+]

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):* 允许按索引编号枚举代理对象的属性以检索属性值。

 

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

ActionScript3 Proxy学习使用

原文:http://www.cnblogs.com/jsncz/p/3633630.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!