我正在使用使用Rickshaw的精彩Prototype's class-based OOP system库。这包括extend
方法,它允许子类扩展父类中的方法,如下所示:
defaults: function() {
return {
tension: 0.8,
// etc...
};
}
defaults: function($super) {
return Rickshaw.extend( $super(), {
fill: true,
// etc...
} );
}
我正在尝试找到在CoffeeScript中执行相同操作的语法,以便CoffeeScript处理Class继承而不是Prototype。你能帮忙吗?
修改
感谢@ tomahaug的回答,我得到了这个工作,我现在意识到有更好的方法。虽然$super
是原型功能,extend
实际上是在Prototype和Rickshaw顶级对象中定义的,如下所示:
extend: (destination, source) ->
for property of source
if (source.hasOwnProperty(property))
destination[property] = source[property]
destination
因此,使用此方法,解决方案如下所示:
defaults: () ->
Rickshaw.extend super(),
fill: true,
// etc...
因此,如果事实证明这是以某种方式内置于CoffeeScript中,那么唯一可以改进另一步的方法就是。
答案 0 :(得分:4)
如果要调用父方法,然后在返回之前用更多信息修饰结果,可以使用纯CoffeeScript执行此操作:
class Parent
defaults: () ->
return {
tension: 0.8
}
class Sub extends Parent
defaults: () ->
r = super
r.fill = true
return r
sub = new Sub
sub.tension # 0.8
sub.fill # true
使用像http://underscorejs.org/这样的库可能会让它变得更漂亮:
defaults: () ->
_.extend super, {
fill: true
}
答案 1 :(得分:0)
这两者的CoffeeScript语法是:
家长班:
defaults: () ->
return {
tension: 0.8,
# etc ...
}
子类:
defaults: ($super) ->
return Rickshaw.extend $super(), {
fill: true,
# etc...
}
请注意,这只是在CoffeeScript中编写代码的众多方法之一。
另外,请记住CoffeeScript中有隐式返回,因此在两种情况下都可以删除return
,因为这些方法不包含任何以下代码。