静态方法& Coffeescript中的继承

时间:2011-07-14 06:56:00

标签: coffeescript

我一直在阅读有关coffeescript的遗产模型的一些内容,我感觉我正处于意识形态辩论的边缘,我真的不明白。所以,我很高兴发现我只是以错误的方式做事。

基本上我正在做的是编写一组小部件,除其他外,需要处理DOM元素上的事件。我认为一个好的方法是使用一个类方法,该方法将被调用一次,以委托小部件可能需要的所有事件。基本窗口小部件类可能有一些简单的单击处理程序,而子类可能会添加一些鼠标悬停处理程序或额外的单击处理程序。

然而,似乎我不应该尝试在静态方法中调用super()。有一种解决方法存在,(this.__super__.constructor.METHODNAME()但我已经看到很多建议,这不是我想要做的最佳方式。有没有人对我应该如何构建有任何见解这段代码?继续使用变通方法,或者将所有委托放在一个完全不同的地方?我真的不能只把它放在原型中,因为我不一定要有一个实例来调用这个方法(或者我可以基本上仍然从静态上下文中调用原型上的方法,比如将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()

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

我建议更换

this.__super__.constructor.delegateEvents()

Widget.delegateEvents()

尝试使用super来调用静态方法不是必需的(并且没有多大意义)

答案 1 :(得分: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的先决条件的话,我可以提出另一种方法。

答案 2 :(得分:1)

听起来你想要一种不同类型的继承模型,其中某个类型的每个继承函数(“父调用”)将遍历继承树并调用其所有父类同名。

您可以在编写时手动调用每个子项中的任何直接父函数。然后它会在你指定这种关系的任何地方浮动继承链。

我会将构造函数中的父委托调用绑定到当前的类函数

delegateparents => 
  #call any parent class methods