Если в классе наследнике от Proxy попытаться вызвать несуществующий метод, то будет вызван метод callProperty, которому передается название метода с массивом аргументов. Это можно использовать для создания динамических методов.
Как и все методы класса Proxy, callProperty объявлен в пространстве имен «flash_proxy» (flash.utils.flash_proxy), чтобы не возникало конфликтов с публичными методами. Для переопределения метода в своем классе обязательно нужно указывать пространство имен flash_proxy.
Пример: класс CustomObject наследуется от Proxy и переопределяет метод callProperty для управления динамическими методами.
Код:
package {
import flash.utils.Proxy;
import flash.utils.flash_proxy;
dynamic public class CustomObject extends Proxy {
private var variables:Object = new Object(); // хранилище переменных
public function CustomObject() {
}
// Вызывает при обращении к динамическому методу
override flash_proxy function callProperty(name:*, ... args):* {
// Преобразуем name в строку
name = String(name);
var callType:String = name.slice(0,3); // get или set
var callVariable:String = name.slice(3); // название переменной
switch(callType) {
case 'get':
// Если «get», то возвращает значение переменной, если она существует
if (callVariable in variables) {
return variables[callVariable];
}
return null;
case 'set':
// Если «set» запомним новую переменную
variables[callVariable] = args[0];
}
}
}
}
В этом примере, с использованием callProperty, реализованы динамические методы для чтения и записи «переменных».
Код:
// пример использования
var myObj:CustomObject = new CustomObject();
trace(myObj.getMyVar()); // null
myObj.setMyVar("foo");
trace(myObj.getMyVar()); // foo
myObj.setMyVar("bar");
trace(myObj.getMyVar()); // bar
trace(myObj.MyVar); // не существует (get property error)
В начале getMyVar возвращает null, поскольку переменная «MyVar», еще не определена. После записи при помощи setMyVar, getMyVar возвращает записанное значение.