CoffeeScript:像Rickshaw Prototype示例中那样扩展超级方法

时间:2013-09-06 11:57:12

标签: javascript coffeescript prototypejs rickshaw

我正在使用使用Rickshaw的精彩Prototype's class-based OOP system库。这包括extend方法,它允许子类扩展父类中的方法,如下所示:

Parent class

defaults: function() {
  return {
    tension: 0.8,
    // etc...
  };
}

Sub class

defaults: function($super) {
  return Rickshaw.extend( $super(), {
    fill: true,
    // etc...
  } );
}

我正在尝试找到在CoffeeScript中执行相同操作的语法,以便CoffeeScript处理Class继承而不是Prototype。你能帮忙吗?

修改

感谢@ tomahaug的回答,我得到了这个工作,我现在意识到有更好的方法。虽然$super是原型功能,extend实际上是在PrototypeRickshaw顶级对象中定义的,如下所示:

extend: (destination, source) ->
  for property of source
    if (source.hasOwnProperty(property))
      destination[property] = source[property]
  destination

因此,使用此方法,解决方案如下所示:

defaults: () ->
  Rickshaw.extend super(), 
    fill: true,
    // etc...

因此,如果事实证明这是以某种方式内置于CoffeeScript中,那么唯一可以改进另一步的方法就是。

2 个答案:

答案 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,因为这些方法不包含任何以下代码。