在Coffeescript类的函数中指定第n个参数的“super”

时间:2013-11-08 21:24:39

标签: javascript coffeescript

关于这个Message类,

class Message
  constructor: (@type) ->

  log: (@title, @text, @delay, @class) ->
    $.growl
      title: @title
      text: '<br>' + @text
      type: @type
      delay: (@delay || 1500)
      class: @class

class Success extends Message
class Error extends Message
class Info extends Message
  log: ->
    super 10000
class Warning extends Message

s = new Success 'success'
e = new Error 'danger'
i = new Info 'info'
w = new Warning 'warning'

有四种不同的Message,我想让扩展的Info始终传递到10000的@delay。如果这是log的第一个参数,我可以说

log: ->
  super 10000

但在这种情况下,它是第三个参数,我如何覆盖它,以便如果我说

i.log('hello')

它会创建一个growl,表示“你好”但延迟10秒?

当然,我可以将@delay移动为第一个参数,但我打算为其他参数进行类似于此的更多覆盖。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

log覆盖声明为variadic function,以便更容易地将参数列表作为数组访问,然后根据需要简单地更改参数数组的倒数第二个值并将其展开回{{1} }:

super

演示:http://jsfiddle.net/ambiguous/eHR4n/

答案 1 :(得分:1)

我认为这可以做你想要的,虽然我做了一些猜测。我也对它进行了修改,使其在Coffeescript“试试”浏览器窗口中运行。并删除了一些额外的东西。

growl = (arg)->  # sub for $.growl
  alert ["#{k}:#{v}" for k,v of arg].join(', ')
class Message
  constructor: (@type='msg') ->
  def_delay: 1500
  log: (title, text, delay=0) ->
    growl
      title: title
      text: '<br>' + text
      type: @type
      delay: (delay ||@def_delay)

class Success extends Message
  constructor: (@type='success') ->
class Info extends Message
  constructor: (@type='info') ->
  def_delay : 10000

new Success().log('title','txt')
new Info().log('title','txt')

我不知道为什么你在@title args中使用log等,除非你想保存这些值以供以后使用。 @arg形式在构造函数参数中很方便,但在其他函数中并不常用。

我使用实例变量def_delay处理您的默认延迟。也可以通过constructor设置为@delay。我认为你正在用super 10000咆哮错误的树。我认为您的info log仍然需要title等参数。

我还给了@type一个默认值,该值因类而异。

答案 2 :(得分:0)

没有任何花哨的参数列表操作,这可能是你可以做的最好的,同时保持它简单易懂:

class Info extends Message
  log: (@title, @text, @delay, @class) ->
    super @title, @text, 1000, @class