AS2: вызов метода при установке нового свойства - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть dynamic Class, и я хотел бы вызывать метод каждый раз, когда свойство добавляется в класс во время выполнения.

Например:

dynamic class Example
{

    public function Example()
    {
        trace("New instance created");
    }

    public function setter(name:String, value:String):Void
    {
        trace("Property '"+name+"' created with value '"+value+"'");
    }
}

А затем из графика, когда я добавлю новое свойство в Пример:

Example.newProperty = "some value";

Я хочу отследить:

Свойство 'newProperty' создано со значением 'some value'

Я полностью осознаю, что это возможно с помощью функции для установки свойств следующим образом:

public function setter(name:String, value:String):Void
{
    this[name] = "some value";
    trace("Property '"+name+"' created with value '"+value+"'");
}

и называя это так:

Example.setter("newProperty", "some value");

Однако я хочу, чтобы этот метод запускался автоматически, когда свойство добавляется через обычный оператор .dot, и нет необходимости явно вызывать функцию.

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2012

Можно использовать Proxy здесь.

Пример класса:

package
{
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;

    dynamic public class Example extends Proxy
    {

        private var _properties:Object = {};


        override flash_proxy function setProperty(name:*, value:*):void
        {
            _properties[name] = value;
            trace("Property '" + name + "' created with value '" + value + "'");
        }


        override flash_proxy function getProperty(name:*):*
        {
            return _properties[name];
        }

    }
}

Демо-код:

var ex:Example = new Example();

ex.something = 10;
ex.more = "something more";

trace(ex.something);
trace(ex.more);

Выход:

Свойство 'нечто' создано со значением '10'
Свойство «больше» создано со значением «нечто большее»
10
нечто большее

0 голосов
/ 08 февраля 2012

Поскольку это AS2, то да, ваш класс должен реализовать метод __resolve(x). Я, однако, считаю это очень сомнительным дизайнерским решением. Функция, которая принимает ключ и значение, выглядит намного лучше для меня, и, в конце концов, это меньше кода.

...