CoffeeScript混入

2018-08-25 13:59 更新
在ruby语言中的Mixin,能够让你的类获得多个模块的方法,可以说是对多重继承一种很好的实现,虽然在CoffeeScript中并没有像ruby的include一样的内置功能,但很容易实现她

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()


继承了Module的类才可以Mixin,当然,这里也可以用组合或者直接为js的构造函数做Monkey patching
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

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号