1

我正在玩奇妙的Rickshaw库,它使用Prototype 的基于类的 OOP 系统。这包括extend允许子类扩展父类中的方法的方法,如下所示:

父类

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

子类

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

我试图在 CoffeeScript 中找到执行相同操作的语法,以便 CoffeeScript 处理类继承而不是原型。你能帮我吗?

编辑

感谢@tomahaug 的回答,我得到了这个工作,我现在意识到有更好的方法。While$super是 Prototype 功能,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 中。

4

2 回答 2

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
    }
于 2013-09-06T12:46:58.197 回答
0

这两个的 CoffeeScript 语法是:

父类:

defaults: () ->
    return {
        tension: 0.8,
        # etc ...
    }

子类:

defaults: ($super) ->
    return Rickshaw.extend $super(), {
        fill: true,
        # etc...
    }

请注意,这只是在 CoffeeScript 中编写代码的众多方法中的一种。

另外,请记住CoffeeScript中有隐式返回return,因此在这两种情况下都可以删除,因为方法不包含任何以下代码。

于 2013-09-06T12:32:49.400 回答