Skip to content

Instantly share code, notes, and snippets.

@marshluca
Last active August 29, 2015 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marshluca/6fc838dfb8a8d131c691 to your computer and use it in GitHub Desktop.
Save marshluca/6fc838dfb8a8d131c691 to your computer and use it in GitHub Desktop.
Mixins for class in CoffeeScript
mixOf = (base, mixins...) ->
class Mixed extends base
for mixin in mixins by -1 # earlier mixins override later ones
for name, method of mixin::
Mixed::[name] = method
Mixed
class MixinClassOne
sayOne: -> "Hello One!"
class MixinClassTwo
sayTwo: -> "Hello Two!"
class BaseClass
constructor: (name) ->
@name = name
say: -> "Hello Base!"
class MyClass extends mixOf BaseClass, MixinClassOne, MixinClassTwo
say: -> "Hello #{@name}"
sayTwo: -> "Greet!"
klass = new MyClass("Lucas")
alert klass.say() # "Hello Lucas"
alert klass.sayOne() # "Hello One!"
alert klass.sayTwo() # "Greet!"
class Mixin
@use = (mixins...) ->
for mixin in mixins
# Notice that now we expect the mixin to be an object.
@::[key] = value for key, value of mixin
@
# So now the "MyClass" class can "extend" objects as well as classes.
Options =
usingMixin: yes
mixinCount: 2
class MixinClassOne
attrOne: "Attribute One"
sayOne: -> 'Hello One!'
class MixinClassTwo
attrTwo: "Attribute Two"
sayTwo: -> 'Hello Two'
class MyClass extends Mixin
# Notice that now instead of passing the class
# we pass the prototype.
@use MixinClassOne::, MixinClassTwo::, Options
sayHello: -> 'Hello MyClass!'
myClass = new MyClass()
alert myClass.usingMixin # true
alert myClass.mixinCount # 2
alert myClass.sayOne() # 'Hello One!'
alert myClass.sayTwo() # 'Hello Two!'
alert myClass.attrOne # 'Attribute One'
alert myClass.attrTwo # 'Attribute Two'
alert myClass.sayHello() # 'Hello MyClass!'
Options =
usingMixin: yes
mixinCount: 2
class MixinClassOne
attrOne: "Attribute One"
sayOne: -> 'Hello One!'
class MixinClassTwo
attrTwo: "Attribute Two"
sayTwo: -> 'Hello Two'
# use $.extend method in jQuery
class MyClass
$.extend true, this::, MixinClassOne::, MixinClassTwo::, Options
sayHello: -> 'Hello MyClass!'
# use _.extend method in underscore.js
class SecondClass
_.extend this::, MixinClassOne::, MixinClassTwo::, Options
sayHello: -> 'Hello SecondClass!'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment