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