CoffeeScript混入
class Module
@extend: (obj) ->
for key, value of obj
@[key] = value
@include: (obj) ->
for key, value of obj
@::[key] = value
classProperties =
find: (id) ->
console.log("find #{id}")
instanceProperties =
save: ->
console.log("save")
class User extends Module
@extend classProperties
@include instanceProperties
user = User.find(1)
user = new User
user.save()
classProperties是类成员模块,使用@extend来Mixin,实现是简单的拷贝对象的属性
instanceProperties是实例成员模块,使用@include来Mixin,实现是拷贝对象原型的属性
需要指出的是,这里的拷贝是引用拷贝,有可能外部会更改被Mixin的模块内部值,更好的方法是深层值拷贝(clone),包括JQuery在内的很多类库都实现了这类扩展方法
extend = (obj, mixin) ->
obj[name] = method for name, method of mixin
obj
include = (klass, mixin) ->
extend klass.prototype, mixin
CoffeeScript里kclass.prototype还可以写成kclass::, 今天在CoffeeScript in action一书里也看到了类似的一种写法
class Mixin
constructor: (methods) ->
for own k,v of methods
@[k]=v
#定义include,把所有的方法加入到Target的类里
include: (kclass) ->
for own k,v of @
kclass::[k] =v
上面是定义了一个Mixin的类,constructor 用来记住要混入的方法,include方法则把他们加入到指定类的prototype中去。
new_mixin = new Mixin
method1: -> console.log 'method1'
method2: -> console.log 'method2'
class TestClass
new_mixin.include @ #这样给TestClass加入了2个新方法, 在CoffeeScript里@就是this的意思
o = new TestClass
o.method1() # method1
更多建议: