运行时版本: | AIR 1.0 Flash Player 9 |
Proxy 类用于覆盖对象的 ActionScript 操作(如检索和修改属性)的默认行为。
Proxy 类没有构造函数,您不应尝试实例化 Proxy。而是应使用 Proxy 类的子类来覆盖诸如 getProperty
之类的方法并提供自定义行为。如果尝试使用 Proxy 类的某个方法而不覆盖该方法,则会引发异常。
同时请记住,您自己的用于覆盖 Proxy 类的方法的代码也可能会意外引发异常。在使用这些方法时引发异常会导致问题,因为调用代码(使用诸如 in
、is
和 delete
等运算符)不应该有异常。除非已经确信您的覆盖方法不会引发异常,否则 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.__resolve
和 Object.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 对象(如果使用了命名空间)。
查看示例
flash_proxy function callProperty(name:*, ... rest):*
运行时版本: | AIR 1.0 Flash Player 9 |
覆盖可作为函数调用的对象属性的行为。在调用对象的某个方法时,将调用此方法。某些对象可作为函数调用,同时某些对象属性也可作为函数调用。
参数
| name:* — 正被调用的方法的名称。 |
|
| ... rest — 一个数组,指定所调用方法的参数。 |
返回另请参见
flash_proxy function deleteProperty(name:*):Boolean
运行时版本: | AIR 1.0 Flash Player 9 |
覆盖删除属性的请求。使用 delete
运算符删除属性时,将调用此方法来执行删除操作。
参数
返回 | Boolean —
如果删除了此属性,则为 true ;否则为 false 。
|
另请参见
flash_proxy function getDescendants(name:*):*
运行时版本: | AIR 1.0 Flash Player 9 |
覆盖 descendant
运算符的使用。在使用 descendant
运算符时,将调用此方法。
参数
| name:* — 要传递到对象中并要搜索的属性的名称。 |
返回另请参见
flash_proxy function getProperty(name:*):*
运行时版本: | AIR 1.0 Flash Player 9 |
覆盖对属性值的任何请求。如果无法找到属性,则该方法返回 undefined
。有关此行为的详细信息,请参阅 ECMA-262 语言规范第三版的 8.6.2.1 小节。
参数
返回 | * —
指定的属性或 undefined (如果未找到属性)。
|
另请参见
flash_proxy function hasProperty(name:*):Boolean
运行时版本: | AIR 1.0 Flash Player 9 |
覆盖请求以按名称来检查对象是否具有特定属性。
参数
返回 | Boolean —
如果此属性存在,则为 true ;否则为 false 。
|
另请参见
flash_proxy function isAttribute(name:*):Boolean
运行时版本: | AIR 1.0 Flash Player 9 |
检查是否还将提供的 QName 标记为属性。
参数
返回 | Boolean —
如果 name 的参数为同样被标记为属性的 QName,则返回 true 。
|
另请参见
flash_proxy function nextName(index:int):String
运行时版本: | AIR 1.0 Flash Player 9 |
允许按索引编号枚举代理对象的属性以检索属性名称。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...in
和 for 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 开始的索引值。 |
返回另请参见
flash_proxy function nextNameIndex(index:int):int
运行时版本: | AIR 1.0 Flash Player 9 |
允许按索引编号枚举代理对象的属性。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...in
和 for 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 开始的索引值,枚举将从该值开始。 |
返回另请参见
flash_proxy function nextValue(index:int):*
运行时版本: | AIR 1.0 Flash Player 9 |
允许按索引编号枚举代理对象的属性以检索属性值。但是,无法枚举 Proxy 类自身的属性。此函数支持对对象实现 for...in
和 for 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 开始的索引值。 |
返回另请参见
flash_proxy function setProperty(name:*, value:*):void
运行时版本: | AIR 1.0 Flash Player 9 |
覆盖更改属性值的调用。如果无法找到属性,此方法将创建一个具有指定名称和值的属性。
参数
| name:* — 要修改的属性的名称。 |
|
| value:* — 要为属性设置的值。 |
另请参见
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;
}
}
© 2004-2008 Adobe Systems Incorporated. All rights reserved.
Sun Dec 14 2008, 10:39 PM -08:00