Думаю, я просто отвечу на свой вопрос.То, как я в итоге справился с этим, расширяет все мои классы из класса, который я называю " 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
@
В значительной степени просто украл его у Позвоночник .Пример класса, расширенного из 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'
Обратите внимание, что для вызова унаследованного конструктора класса функция класса вызывается с @
/ this
в качестве контекста.Мне еще не нужно было расширять функции класса, но я думаю, что это очень похоже на вызов родительского конструктора:
someFunction: ->
ExtendedClass::someFunction.call @
Пожалуйста, отредактируйте этот пост, если я ошибаюсь.Также прошу прощения за отсутствие терминологии наследования классов - я не эксперт
Обновление: Можно также определить конструктор для SuperClass, который автоматически вызывает конструктор для всех включенных классов при создании экземпляра.Таким образом, вам просто нужно позвонить super()
из подкласса.Я не беспокоился об этом, хотя