2011-07-14 88 views
7

我一直在读一些关于coffeescript的继承模型,我感觉到我处于意识形态辩论的边缘,我真的不明白。所以,我会非常高兴地发现我只是以错误的方式做事。Coffeescript中的静态方法和继承

基本上我正在做的是编写一组窗口小部件,其中包括需要处理其DOM元素上的事件。我认为一个很好的方法去做这件事,那就是有一个可以调用一次的类方法来委托widget可能需要的所有事件。基础小部件类可能有一些简单的点击处理程序,而子类可能会添加一些鼠标悬停处理程序或额外的点击处理程序。

但是,看起来我不应该试图在静态方法内调用super()。有一个解决方法存在,但我已经看到很多建议,这不是做我想做的最好的方法。有没有人有任何见解我应该如何构造这段代码?Keep使用变通方法,还是把所有的委托放到一个完全不同的地方?我不能真的把它粘在原型中,因为我不一定有一个实例调用该方法(或者我基本上仍然可以调用一个方法?在原型从静态上下文,就像把SwatchableWidget.prototype.delegateEvents()成一个onload函数或东西

下面是一些代码来说明什么我谈论:

class Widget 
    @testProp: "ThemeWidget" 
    @delegateEvents: -> 
     console.log "delegate some generic events" 

class SwatchableWidget extends Widget 
    @testProp2 = "SwatchWidget" 
    @delegateEvents: -> 
     console.log "delegate some specific swatchable widget events" 
     this.__super__.constructor.delegateEvents() 

Widget.delegateEvents() 
SwatchableWidget.delegateEvents() 

感谢您的HEL页。

回答

1

这听起来像你更换

this.__super__.constructor.delegateEvents() 

需要一种不同类型的继承模型,其中每个继承的特定类型的函数(“父调用”)将遍历继承树,并调用其所有父项具有相同的名称。

你可以像你写的那样手动调用每个孩子的任何直接父功能。然后它会在你指定这种关系的任何地方浮动继承链。

我会在构造函数中的父母委托调用绑定到当前类功能

delegateparents => 
    #call any parent class methods 
2

我不明白为什么delegateEvents将是一个级别的方法,或为什么Widget.delegateEvents必须再次从SwatchableWidget.delegateEvents调用。如果它只是类的初始化代码,你应该把它放在类主体直接:

class Widget 
    console.log "delegate some generic events" 
    ... 
    @testProp: "ThemeWidget" 

class SwatchableWidget extends Widget 
    console.log "delegate some specific swatchable widget events" 
    ... 
    @testProp2 = "SwatchWidget" 

我想你正在等待特定的DOM状态运行此初始化代码之前?也许我可以建议另一种方法,如果你告诉我更多关于delegateEvents的先决条件。

3

我建议用

Widget.delegateEvents() 

试图用超级调用静态方法不是必需的(并且没有太大的意义)

+0

我喜欢这个,但随后每派生类将需要显式调用它的父类的代表事件。如果每个父类名称都被更改,则需要手动更新委托事件和类似的调用。重读我自己的回答,我仍然不知道一个干净的方式来自动调用父类中的命名函数,超出了原作者的建议。 –