Last active
August 29, 2015 14:04
-
-
Save marshluca/6fc838dfb8a8d131c691 to your computer and use it in GitHub Desktop.
Mixins for class in CoffeeScript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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!" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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!' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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