CoffeeScript混入

2018-08-25 13:59 更新
在ruby語言中的Mixin,能夠讓你的類獲得多個模塊的方法,可以說是對多重繼承一種很好的實現(xiàn),雖然在CoffeeScript中并沒有像ruby的include一樣的內置功能,但很容易實現(xiàn)她

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的構造函數(shù)做Monkey patching
classProperties是類成員模塊,使用@extend來Mixin,實現(xiàn)是簡單的拷貝對象的屬性
instanceProperties是實例成員模塊,使用@include來Mixin,實現(xiàn)是拷貝對象原型的屬性

需要指出的是,這里的拷貝是引用拷貝,有可能外部會更改被Mixin的模塊內部值,更好的方法是深層值拷貝(clone),包括JQuery在內的很多類庫都實現(xiàn)了這類擴展方法


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

公眾號
微信公眾號

編程獅公眾號