flash.utils
public class Proxy
继承Proxy Inheritance Object
子类 AbstractService, ConfigMap, DescribeTypeCacheRecord, ListCollectionView, ObjectProxy, OLAPCube, OLAPElement

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

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

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

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

dynamic class MyProxy extends Proxy {
     flash_proxy override function callProperty(name:*, ...rest):* {
       try {
         // custom code here
       }
       catch (e:Error) {
         // respond to error here
       }
 }

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

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

在 Proxy 类的方法采用 name 参数的地方,name 可以为 String 或 QName 对象(如果使用了命名空间)。

查看示例



公共属性
 属性定义方
 Inheritedconstructor : Object
对类对象或给定对象实例的构造函数的引用。
Object
 Inheritedprototype : Object
[静态] 对类或函数对象的原型对象的引用。
Object
公共方法
 方法定义方
 Inherited
指示对象是否已经定义了指定的属性。
Object
 Inherited
指示 Object 类的实例是否在指定为参数的对象的原型链中。
Object
 Inherited
指示指定的属性是否存在、是否可枚举。
Object
 Inherited
设置循环操作动态属性的可用性。
Object
 Inherited
返回指定对象的字符串表示形式。
Object
 Inherited
返回指定对象的原始值。
Object
受保护的方法
 方法定义方
  
callProperty(name:*, ... rest):*
覆盖可作为函数调用的对象属性的行为。
Proxy
  
覆盖删除属性的请求。
Proxy
  
覆盖 descendant 运算符的使用。
Proxy
  
覆盖对属性值的任何请求。
Proxy
  
覆盖请求以按名称来检查对象是否具有特定属性。
Proxy
  
检查是否还将提供的 QName 标记为属性。
Proxy
  
允许按索引编号枚举代理对象的属性以检索属性名称。
Proxy
  
允许按索引编号枚举代理对象的属性。
Proxy
  
nextValue(index:int):*
允许按索引编号枚举代理对象的属性以检索属性值。
Proxy
  
setProperty(name:*, value:*):void
覆盖更改属性值的调用。
Proxy
方法详细信息
callProperty()方法
flash_proxy function callProperty(name:*, ... rest):*

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

覆盖可作为函数调用的对象属性的行为。在调用对象的某个方法时,将调用此方法。某些对象可作为函数调用,同时某些对象属性也可作为函数调用。

参数

name:* — 正被调用的方法的名称。
 
... rest — 一个数组,指定所调用方法的参数。

返回
* — 所调用方法的返回值。

另请参见

deleteProperty()方法 
flash_proxy function deleteProperty(name:*):Boolean

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

覆盖删除属性的请求。使用 delete 运算符删除属性时,将调用此方法来执行删除操作。

参数

name:* — 要删除的属性的名称。

返回
Boolean — 如果删除了此属性,则为 true;否则为 false

另请参见

getDescendants()方法 
flash_proxy function getDescendants(name:*):*

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

覆盖 descendant 运算符的使用。在使用 descendant 运算符时,将调用此方法。

参数

name:* — 要传递到对象中并要搜索的属性的名称。

返回
*descendant 运算符的结果。

另请参见

getProperty()方法 
flash_proxy function getProperty(name:*):*

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

覆盖对属性值的任何请求。如果无法找到属性,则该方法返回 undefined。有关此行为的详细信息,请参阅 ECMA-262 语言规范第三版的 8.6.2.1 小节。

参数

name:* — 要检索的属性的名称。

返回
* — 指定的属性或 undefined(如果未找到属性)。

另请参见

hasProperty()方法 
flash_proxy function hasProperty(name:*):Boolean

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

覆盖请求以按名称来检查对象是否具有特定属性。

参数

name:* — 要检查的属性的名称。

返回
Boolean — 如果此属性存在,则为 true;否则为 false

另请参见

isAttribute()方法 
flash_proxy function isAttribute(name:*):Boolean

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

检查是否还将提供的 QName 标记为属性。

参数

name:* — 要检查的属性的名称。

返回
Boolean — 如果 name 的参数为同样被标记为属性的 QName,则返回 true

另请参见

nextName()方法 
flash_proxy function nextName(index:int):String

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

允许按索引编号枚举代理对象的属性以检索属性名称。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...infor each..in 循环以检索所需的名称。

例如(使用 Proxy.nextNameIndex() 中的代码):

protected var _item:Array; // array of object's properties
     override flash_proxy function nextNameIndex (index:int):int {
         // initial call
         if (index == 0) {
             _item = new Array();
             for (var x:* in _target) {
                _item.push(x);
             }
         }
     
         if (index < _item.length) {
             return index + 1;
         } else {
             return 0;
         }
     }
     override flash_proxy function nextName(index:int):String {
         return _item[index - 1];
     }

参数

index:int — 对象属性从 0 开始的索引值。

返回
String — 字符串。属性的名称。

另请参见

nextNameIndex()方法 
flash_proxy function nextNameIndex(index:int):int

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

允许按索引编号枚举代理对象的属性。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...infor each..in 循环以检索属性索引值。

例如:

protected var _item:Array; // array of object's properties
     override flash_proxy function nextNameIndex (index:int):int {
         // initial call
         if (index == 0) {
             _item = new Array();
             for (var x:* in _target) {
                _item.push(x);
             }
         }
     
         if (index < _item.length) {
             return index + 1;
         } else {
             return 0;
         }
     }
     override flash_proxy function nextName(index:int):String {
         return _item[index - 1];
     }

参数

index:int — 从 0 开始的索引值,枚举将从该值开始。

返回
int — 属性的索引值。

另请参见

nextValue()方法 
flash_proxy function nextValue(index:int):*

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

允许按索引编号枚举代理对象的属性以检索属性值。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...infor each..in 循环以检索所需的值。

例如(使用 Proxy.nextNameIndex() 中的代码):

protected var _item:Array; // array of object's properties
     override flash_proxy function nextNameIndex (index:int):int {
         // initial call
         if (index == 0) {
             _item = new Array();
             for (var x:* in _target) {
                _item.push(x);
             }
         }
     
         if (index < _item.length) {
             return index + 1;
         } else {
             return 0;
         }
     }
     override flash_proxy function nextName(index:int):String {
         return _item[index - 1];
     }

参数

index:int — 对象属性从 0 开始的索引值。

返回
* — 属性的值。

另请参见

setProperty()方法 
flash_proxy function setProperty(name:*, value:*):void

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

覆盖更改属性值的调用。如果无法找到属性,此方法将创建一个具有指定名称和值的属性。

参数

name:* — 要修改的属性的名称。
 
value:* — 要为属性设置的值。

另请参见

示例 如何使用示例
ProxyExample.as

package {
    import flash.display.Sprite;

    public class ProxyExample extends Sprite {
        public function ProxyExample() {
            var arr:ProxyArray = new ProxyArray();
            arr.push(1);
            arr.push(-2);
            arr.push(3);
            arr.push(4);
            arr.push("five");
            
            trace(arr.length); // 5
            trace(arr[0]);     // 1
            trace(arr[1]);     // -2
            trace(arr[2]);     // 3
            trace(arr[3]);     // 4

            trace(arr.sum());  // 6

            arr.clear();
            trace(arr); // (empty string)
            
            arr[0] = "zero";
            trace(arr); // zero
        }
    }
}

import flash.utils.Proxy;
import flash.utils.flash_proxy;

dynamic class ProxyArray extends Proxy {
    private var _item:Array;

    public function ProxyArray() {
        _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) {
                    // ignore non-numeric values
                    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;
    }
}