在 Coffeescript 类的函数中指定第 n 个参数的“super”
Specify "super" of nth parameter in Coffeescript class's function
关于这个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
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 使用Express捕获参数
- 参数变量出现ngTable指令问题
- AngularJS:我可以跳过函数参数回调吗
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 要求未定义JS回调参数
- 我的jQuery插件参数没有正确启动,遇到了问题
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- jquery设置为使用参数运行
- Javascript”;类“;带有参数的扩展
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 函数未将值作为参数传递
- 如何将参数传递到angularJs中的工厂
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- MVC 3页面导航和使用javascript传递参数
- 在Chrome V8中实例化从Object扩展的类时,super()不传递参数
- 在 Coffeescript 类的函数中指定第 n 个参数的“super”
- 在没有任何参数的情况下,super()做什么?
- 带有可变参数的ES6类super()