2015-11-29 90 views
0

基于this question。 我正在从RequireJS转到browserify(和babelify一起),并尝试将我当前的模块重写为类。对于我的每个RequireJS模块,我都有一个名为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,在bindSpecificEventsunbindSpecificEvents仍然会被调用时超方法被调用。我想我必须改变我现在处理事件的方式......你能告诉我如何正确处理这个问题吗?也许是一个单独的类,仅用于注册和分离方法的事件处理?

+0

你是什么意思*“当我知道扩展这个类并在子类中实现一个带有不同someBreakpoint的checkBreakpoint时,bindSpecificEvents和unbindSpecificEvents在调用super方法时仍然会被调用。在'Tooltip'中,对'this.checkBreakpoint'的调用将调用实例上的实际'checkBreakpoint',该实例将由实例化的类(例如子类)定义。 –

回答

1

当我现在在子类中不同someBreakpoint扩展这个类并实现一个checkBreakpoint,在bindSpecificEventsunbindSpecificEvents仍然会得到时候被调用的方法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#method1this.method2电话Derived#method2,不Base#method2呼叫。这对多态性至关重要。

+0

啊蠢,我假设都被叫了..谢谢!但无论如何,你能否告诉我你将如何更好地处理这种情况? – enyce12

+0

@ enyce12 :(不愚蠢。)默认情况下,只有继承系列中的“最新”一个会被调用。当然,它可以调用'super.checkBreakpoint()',如果它认为它应该的话(这是新语法糖的原因的一部分,以前很难超级调用),但是如果超级调用不会被调用。我不确定你目前的方法存在的问题是你想要解决的问题。从我理解的很少,似乎很好,除了可能有一些命名(我不会叫*设置事件处理程序eventHandler;听起来像它是一个)。 –

+0

我实际上想要实现的是:http://tinyurl.com/pctmjm4。但是,我不想直接创建一个新的实例,而是想从继承中获益......但我认为它不会按照我希望的方式工作。 – enyce12