该文档解释了如何扩展类
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()要从子类调用.尽管如此,我并没有为此烦恼
这被称为mixin.CoffeeScript将永远不会包含它们,因为您可以在CoffeeScript FAQ的"类"部分中阅读.但是在这本Gist中,Little Book中有各种各样的实现,而JS的这个实现似乎也适用于CoffeeScript Classes.
| 归档时间: |
|
| 查看次数: |
9765 次 |
| 最近记录: |