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

Specify "super" of nth parameter in Coffeescript class's function

本文关键字:参数 super Coffeescript 函数      更新时间:2023-09-26

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

它会创建一个说"你好"但延迟 10 秒的growl

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

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

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

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

我认为这符合您的要求,尽管我做了一些猜测。 我还修改了它,使其在 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')

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

我使用实例变量处理您的默认延迟,def_delay . 这也可以通过constructor设置为@delay。 我想你用super 10000吠错了树. 我认为您的info log仍然需要像title这样的论据。

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

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

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