0

关于这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'

有四种不同的Messages,我想让扩展的Info总是通过@delay10000。如果这是 的第一个参数log,我可以说

log: ->
  super 10000

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

i.log('hello')

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

当然,我可以直接@delay成为第一个参数,但我计划对其他参数进行更多类似于此的覆盖。有没有办法做到这一点?

4

3 回答 3

1

我认为这可以满足您的要求,尽管我已经做出了一些猜测。我还对其进行了修改,使其在 Coffeescript 'try it' 浏览器窗口中运行。并删除了一些额外的东西。

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 中使用 etc log,除非你想保存这些值以备后用。这种@arg形式在构造函数参数中很方便,但在其他函数中不常用。

我使用实例变量来处理您的默认延迟,def_delay. 这也可以通过constructoras设置@delay。我认为你用super 10000. 我认为您info log仍然需要像title.

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

于 2013-11-11T21:58:06.677 回答
1

将您的覆盖声明log可变参数函数,以便更轻松地以数组的形式访问参数列表,然后根据需要简单地更改参数数组的倒数第二个值并将其重新设置为super

class Info extends Message
  log: (args...) ->
    args[args.length - 2] = 10000
    super args...

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

于 2013-11-08T22:00:52.610 回答
0

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

class Info extends Message
  log: (@title, @text, @delay, @class) ->
    super @title, @text, 1000, @class
于 2014-02-23T23:20:43.197 回答