在咖啡脚本中扩展多个类

Hub*_*bro 16 coffeescript

该文档解释了如何扩展类

class Zebra extends Animal
    ...
Run Code Online (Sandbox Code Playgroud)

但是我如何扩展多个类?以下就不能正常工作

class Sidebar extends Controller, EventEmitter
    ...
Run Code Online (Sandbox Code Playgroud)

但我希望它能做到.这背后的JavaScript是能够使用该__extend函数扩展任意数量的类,但有没有办法在咖啡脚本中做到这一点?

Hub*_*bro 37

猜猜我会回答我自己的问题.我最终处理这个问题的方法是将我的所有类扩展到我称之为" SuperClass " 的类中(名称无关紧要).从那个班级我可以扩展任意数量的课程.无论如何,这个班级看起来像这样

moduleKeywords = ['included', 'extended']

class SuperClass
    @include: (obj) ->
        throw('include(obj) requires obj') unless obj
        for key, value of obj.prototype when key not in moduleKeywords
            @::[key] = value

        included = obj.included
        included.apply(this) if included
        @
Run Code Online (Sandbox Code Playgroud)

几乎只是从Spine偷了它.从SuperClass扩展的类的示例:

class Sidebar extends SuperClass

    # Include some other classes
    @include Controller
    @include EventEmitter

    ###
    Constructor function
    ###
    constructor: ->
        # Call extended constructors
        Controller.call @
        EventEmitter.call @

        console.log 'Sidebar instantiated'
Run Code Online (Sandbox Code Playgroud)

请注意,要调用继承的类的构造函数,使用@/ thisas context 调用类函数.我还没有需要扩展类函数,但我想它与调用父构造函数非常相似:

someFunction: ->
    ExtendedClass::someFunction.call @
Run Code Online (Sandbox Code Playgroud)

如果我错了,请编辑这篇文章.也请原谅我缺乏类继承术语 - 我不是专家


更新:还可以为SuperClass定义一个构造函数,该构造函数在实例化时自动为所有包含的类调用构造函数.这样你只需super()要从子类调用.尽管如此,我并没有为此烦恼


Lar*_*one 6

这被称为mixin.CoffeeScript将永远不会包含它们,因为您可以在CoffeeScript FAQ的"类"部分中阅读.但是在这本Gist中,Little Book中有各种各样的实现,而JS的这个实现似乎也适用于CoffeeScript Classes.