我最近读了一些关于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()
谢谢你的帮助
我建议替换
this.__super__.constructor.delegateEvents()
Widget.delegateEvents()
尝试使用super调用静态方法是不必要的(也没有多大意义)
我不明白为什么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
的先决条件,也许我可以建议另一种方法。
听起来您想要一种不同类型的继承模型,其中每个特定类型的继承函数("父调用")将遍历继承树并调用所有具有相同名称的父函数。
您可以像您所写的那样手动调用每个子函数中的任何直接父函数。然后,它将沿着继承链向上浮动到指定这种关系的任何位置。
我将在构造函数中将父类委托调用绑定到当前类函数
delegateparents =>
#call any parent class methods