2

考虑以下 CoffeeScript 类:

class Event
    trigger : (args...) =>
        ...

    bind : (args...) =>
        ...

用例是:

message_received = new Event()
message_received.bind(alert)                                       
message_received.trigger('Hello world!') # calls alert('Hello world') 

有没有办法以调用具有“可调用对象”快捷Event方式的方式编写类:.trigger(...)

message_received('Hello world')  # ?

谢谢!

4

2 回答 2

4

您需要从构造函数返回一个函数,该函数使用当前实例的属性进行扩展(而后者又继承自Event.prototype)。

class Event
    constructor : ->
        shortcut = -> shortcut.trigger(arguments...)
        for key, value of @
            shortcut[key] = value
        return shortcut

    trigger : (args...) =>
        ...

    bind : (args...) =>
        ...

编译结果

于 2012-10-15T11:04:32.330 回答
1

查看https://gist.github.com/shesek/4636379。它允许你写这样的东西:

Event = callable class
    trigger : (args...) =>
        ...
    bind : (args...) =>
        ...

    callable: @::trigger

注意:它依赖于__proto__(没有其他方法可以设置函数的 [[Prototype]]),所以如果你需要它在 IE 上工作,你不应该使用它。当我知道用户不会使用 IE 时,我将它用于服务器端代码和 Intranet 项目。

于 2013-03-04T23:55:17.227 回答