2015-11-29 6 views
0

Основано на this question. Я перехожу из RequireJS, чтобы обозревать (вместе с babelify) и попытаться переписать мои текущие модули на классы. Для каждого из моих модулей RequireJS у меня есть метод eventHandler, который обрабатывает все общие события, связанные с модулем. Теперь, когда я расширяю класс, родительский класс вызывает метод eventHandler подкласса, который приводит к вызову метода дважды.Обработка событий с подклассами

Однако есть еще одна проблема с моим текущим кодом. У меня также есть два метода для нескольких модулей для связывания и отвязывания событий. Сайт, над которым я работаю, - это отзывчивый сайт, который имеет один и тот же JS по всем размерам устройства. На некоторых размерах экрана (контрольных точках) я хочу связать определенные события, а с другими я не должен (или даже отпереть их при выходе из другой точки останова). Так типичный модуль будет выглядеть более или менее так:

'use strict'; 

let specificEventsBound = false; 

class Tooltip { 
    constructor() { 
     this.eventHandler(); 
    } 

    eventHandler() { 
     // bind general events across all breakpoints 
    } 

    bindSpecificEvents() { 
     // bind breakpoint specific events 
     specificEventsBound = true; 
    } 

    unbindSpecificEvents() { 
     // unbind breakpoint specific events 
     specificEventsBound = false; 
    } 

    checkBreakpoint() { 
     if(someBreakpoint) { 
      this.bindSpecificEvents(); 
     } else { 
      this.unbindSpecificEvents(); 
     } 
    } 
} 

module.exports = Tooltip; 

Когда я теперь продлить этот класс и реализовать checkBreakpoint с в подклассе другого someBreakpoint, тем bindSpecificEvents и unbindSpecificEvents равно будут вызваны, когда супер методы get invoked. Я думаю, что мне нужно изменить, как я сейчас обрабатываю события ... Не могли бы вы предложить мне, как правильно справиться с этим? Возможно, отдельный класс для обработки событий с помощью методов регистрации и снятия?

+0

Что вы подразумеваете под * «Когда я знаю, расширяю этот класс и реализую checkBreakpoint с другой someBreakpoint в подклассе, bindSpecificEvents и unbindSpecificEvents будут по-прежнему вызываться при вызове супер-методов.» *? В 'Tooltip' вызовы' this.checkBreakpoint' вызовут фактическую 'checkBreakpoint' в экземпляре, которая будет определяться классом, который был создан (например, подкласс). –

ответ

1

Когда я теперь продлить этот класс и реализовать checkBreakpoint с другим someBreakpoint в подклассе bindSpecificEvents и unbindSpecificEvents равно будут вызваны, когда super методов получают вызов.

Возможно, у вас есть недоразумение. Даже в коде суперкласса this.checkBreakpoint будет искать свойство checkBreakpoint объекта, найти его на прототипе объекта (подкласса) и называть эту версию checkBreakpoint.

Вот простой пример (live copy on Babel's REPL):

class Base { 
    constructor() { 
    this.method1(); 
    } 
    method1() { 
    this.method2(); 
    } 
    method2() { 
    console.log("Base#method2"); 
    } 
} 

class Derived extends Base { 
    method2() { 
    console.log("Derived#method2"); 
    } 
} 

new Derived; 

Выход:

 
Derived#method2 

Обратите внимание, как вызов в Base#method1 к this.method2 вызовов Derived#method2, не Base#method2. Это важно для полиморфизма.

+0

Ах, глупо, я предположил, что оба вызвали .. Спасибо! Но так или иначе, не могли бы вы посоветовать мне, как бы вы лучше справились с такой ситуацией? – enyce12

+0

@ enyce12: (Не глупо.) По умолчанию будет вызван только «последний» в серии наследования. Разумеется, он может вызвать 'super.checkBreakpoint()', если он думает, что это нужно (это часть причины для нового синтаксического сахара, суперкары были трудными раньше), но если это не супер, , Я не совсем уверен, что проблема с вашим текущим подходом заключается в том, что вы пытаетесь решить. Из того, что мало я понимаю, кажется прекрасным, кроме, возможно, некоторого наименования (я бы не назвал то, что * устанавливает * обработчики событий «eventHandler», что звучит так, как будто это * один). –

+0

Что я на самом деле хочу достичь, так это: http://tinyurl.com/pctmjm4.Но вместо прямого создания нового экземпляра я хотел получить прибыль от наследования ... Но я думаю, что это не будет работать так, как я этого хочу. – enyce12

Смежные вопросы