关于这个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
移动为第一个参数,但我打算为其他参数进行类似于此的更多覆盖。有没有办法做到这一点?
答案 0 :(得分:1)
将log
覆盖声明为variadic function,以便更容易地将参数列表作为数组访问,然后根据需要简单地更改参数数组的倒数第二个值并将其展开回{{1} }:
super
答案 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