Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.07.2014, 22:16
Новичок на форуме
Отправить личное сообщение для Novascriptum Посмотреть профиль Найти все сообщения от Novascriptum
 
Регистрация: 13.07.2014
Сообщений: 2

Правильная перегрузка метода-обработчика события
Всем доброго времени!
Пусть имеется некая абстрактная функция-конструктор:

function AbstractObj(){
    var me = this;
    this.param = 'some param';
    this.a = function(e){
        console.log(me);
    }
    this.b = function(){
        $('some element').click(this.a);  //Здесь может быть любой код, который ставит какому-то событию обработчик "this.a"
    }
}


Теперь есть некий кусок кода, который создает объект и пытается переопределить метод-обработчик:
var com = new AbstractObj();
com.a = function(e){
    console.log('Overrided:');
    console.log(me);
}
com.b();

В результате при возникновении нашего события, описанного в методе b, получим сообщение об ошибке: "Uncaught ReferenceError: me is not defined".
Значит, новая функция "a" не имеет доступа к внутренним переменным AbstractObj. Попробовал замыкания. Добавим в AbstractObj метод для перегрузки:

function AbstractObj(){
    //Все то же самое плюс новая функция
    this.Override = function(key, value){
        this[key] = (function(){
            return value;
        })();
    }
}


Используем:
var com = new AbstractObj();
com.Override('a', function(e){
    console.log('Overrided:');
    console.log(me);
});
com.b();


В результате получаем ту же ошибку. Вопрос: как сделать, чтобы из нового метода был доступ к переменным вроде "me"?
Ответить с цитированием
  #2 (permalink)  
Старый 13.07.2014, 22:31
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Никак.
Либо this.me = me, либо this.getMe=function(){return me}.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 13.07.2014, 22:33
Новичок на форуме
Отправить личное сообщение для Novascriptum Посмотреть профиль Найти все сообщения от Novascriptum
 
Регистрация: 13.07.2014
Сообщений: 2

Видимо, я проблему обозначил не совсем точно.
Метод-обработчик события отличается от обычного метода тем, что this в нем указывает на объект события, а не на родительский объект метода.
Проблема как раз в том, чтобы получить доступ к этому this родительского объекта. Чтобы хотя бы узнать this.param. В новом методе "a" теряется всякая связка с родительским объектом и его даже публичными свойствами.
Ответить с цитированием
  #4 (permalink)  
Старый 13.07.2014, 22:39
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

obj.method.bind(this).
- привязывает конкретный this к функции.
Полифил для старых браузеров(с mdn):
if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5
      // internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                 ? this
                 : oThis,
                 aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление обработчика события FanAizu Общие вопросы Javascript 3 23.08.2013 18:46
вызов ф-ции обработчика как метода объекта FanAizu Общие вопросы Javascript 5 23.08.2013 15:52
Алгоритм работы обработчика события salikoff Events/DOM/Window 1 20.09.2012 23:46
Получить значение из обработчика события mirek Общие вопросы Javascript 16 08.06.2012 23:16
Установка обработчика события dvikv jQuery 5 13.03.2012 19:51