【问题标题】:CoffeeScript: Extend super method like in Rickshaw Prototype exampleCoffeeScript:在 Rickshaw Prototype 示例中扩展超级方法
【发布时间】:2013-09-10 12:38:04
【问题描述】:

我正在玩奇妙的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 处理类继承而不是原型。你能帮忙吗?

编辑

感谢@tomahaug 的回答,我得到了这个工作,现在我意识到有更好的方法。虽然$super 是Prototype 功能,但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 中的,那么可以进一步改进的唯一方法。

【问题讨论】:

  • 你想把这两个例子翻译成 CoffeeScript 还是想问 CoffeeScript OOP 系统是否可以做类似的事情?
  • 我已经将它翻译成 CoffeeScript,而且它大部分都在工作。正是这种模式让我苦苦挣扎。

标签: javascript coffeescript prototypejs rickshaw


【解决方案1】:

这两个的 CoffeeScript 语法是:

父类:

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

子类:

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

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

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

【讨论】:

  • 谢谢。我不相信这是对的。那仍然使用extend 和$super,它们是Prototype features
  • 啊,所以您在 CoffeeScript 中要求相同的模式,但没有 Rickshaw 库?
  • 那个。 Rickshaw uses Prototype 用于类继承,我正在尝试将其切换到 CoffeeScript。将澄清问题。
  • 我发布了一个新答案,只使用 CoffeeScript :)
【解决方案2】:

如果你想调用父方法,然后在返回之前用更多信息装饰结果,你可以用纯 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
    }

【讨论】:

  • 完美!现在我明白了,这完全有道理。非常感谢。
  • 没问题,很高兴为您提供帮助!周末愉快:)
  • 刚刚看到您的编辑。不要认为return r 在这种情况下是可选的。如果你忽略它,我想它会返回r.fill。
猜你喜欢
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多