пятница, 10 сентября 2010 г.

Событие изменения свойства в Javascript

Довольно частая задача - запустить какие-то действия в скрипте в ответ на изменение некоторого свойства объекта. Подумав в очередной раз над этой задачей написал небольшой класс реализующий это поведение.

function Property (param_value) {
var value = param_value;
var delegates = new Array();
var RiseChangedEvent = function () {
$.each(delegates, function (index, item) {
item(value);
});
};
this.Property = function () {

this.SetChangedEventDelegate = function (delegate) {
delegates.push(delegate);
};
this.Get = function () {
return this;
};
this.Set = function (param_value) {
value = param_value;
RiseChangedEvent();
};

};
return new this.Property();
};

delegates - коллекция ссылок на функции обратного вызова.
Подписываемся функцией - SetChangedEventDelegate(),


Использование:


event.finished = new Property(event.finished);
//Заменяем переменную свойством (объектом класса Proerty)
event.finished.SetChangedEventDelegate(function (value) {
input.attr("checked", value);
});
//Подписываемся на событие изменения свойства
//Теперь все обращения только через get и set
var input = event.finished.Get();
event.finished.Set(this.checked);

3 комментария :

  1. Может, я что-то недопонял, но, по-моему, в реализации класса Property есть некоторые неоправданные излишества. В традиционном js (без изысков типа "$.each") я бы написал так:

    function Property(param_value)
    {
        var value = param_value;
        var delegates = new Array();

        this.SetChangedEventDelegate = function (delegate)
        {
            delegates.push(delegate);
        };

        this.Get = function ()
        {
            return value;
        };

        this.Set = function (param_value)
        {
            value = param_value;
            RiseChangedEvent();
        };

        function RiseChangedEvent()
        {
            for(var i = 0; i < delegates.length; i++)
            {
                delegates[i](value);
            };
        };
    };

    ОтветитьУдалить
  2. Это я так эмулирую приватные методы.

    ОтветитьУдалить
  3. Аааа... ) Понимаю. Но это слишком хитрО. В js приватный метод - это обычная именованная функция, объявленная внутри функции-конструктора прототипа. Ее поле видимости будет ограничено пределами этой функции-конструктора.

    А так, по всему видно, что писал заядлый дотнетчик )

    ОтветитьУдалить