《CoffeeScript應用開發》學習:第五章 CoffeeScript中的類

在CoffeeScript中定義類

在CoffeeScript中,使用class定義類,使用關鍵字new實例化對象。javascript

給類綁定方法

class Airplane
    takeOff: ->
        console.log 'Vrroom!'

plane = new Airplane()
plane.takeOff()

CoffeeScript如何構建Javascript類

CoffeeScript中的類型系統基於JavaScript的原型繼承實現。上面的代碼生成的JavaScript代碼爲:java

var Airplane;

Airplane = (function() {
    function Airplane() {}

    Airplane.prototype.takeOff = function() {
      return console.log('Vrroom!');
    };

    return Airplane;

})();

上面的例子中,函數先聲明空構造函數,並將takeOff函數綁定到類的原型上。dom

保持對象屬性狀態

狀態存儲在綁定到對象的屬性裏。使用@運算符實現。ide

class Airplane
    describle: ->
        "A #{@color} plane"

plane = new Airplane()
plane.color = 'white'
console.log plane.describle # 輸出white

在對象中調用其餘方法

class Airplane
    takeOff: (eta) ->
        @taxi()
        console.log "#{s}..." for s in [eta..0]
        console.log 'Vrrroom'
    taxi: ->
        if Math.random() > 0.5
            console.log 'Taxiing...'

@something其實是this.something的別名。咱們甚至@替換出現的this。能夠將@做爲this做爲參數傳遞。函數

在類定義的外面綁定方法

CoffeeScript提供::運算符,以簡單實現對象原型的訪問。如:this

Date::getYearAE = ->
    monthOffset = if @getMonth() < 11 then 1 else 0
    @getFullYear() - 1944 - monthOffset

today = new Date()
console.log "It is the year #{today.getYearAE()} AE" # 輸出 It is the year 71 AE

上面使用::運算符的CoffeeScript代碼編譯爲prototype

Date.prototype.getYearAE = function() {
    var monthOffset;
    monthOffset = this.getMonth() < 11 ? 1 : 0;
    return this.getFullYear() - 1944 - monthOffset;
  };

能夠看到::使用原型來實現把函數綁定到類。code

構造函數

只要加上名字爲constructor的方法。同時,若是在構造函數列表中使用@命名標識符,則自動賦值給同名屬性對象

class Train
    constructor: (@numCars, @type = 'diesel') ->
        @load = 0
        @capacity = @numCars * 100

類的靜態方法調用

靜態方法爲綁定到類自己,在沒有任何實例化的對象時,能夠做爲單獨的引用使用。在CoffeeScript中,使用@開頭的函數爲靜態函數。例:繼承

同時,也可將靜態屬性綁定到類。

class Bicyle
    @WHEELS = 2
    @frameSizeByHeight: (rideHeight) ->
        Math.floor rideHeight * 0.82

Bicyle.frameSizeByHeight 10   # 調用靜態方法
console.log Bicyle.WHEELS    # 輸出 2

繼承

在CoffeeScript中,類定義使用extends代表這個類繼承自另外一個類。

class Automobile
    honk: ->
        console.log 'Beep!'

class Truck extends Automobile
    honk: ->
        super()
        console.log 'Wee-oo wee-oo wee-oo'

同時,CoffeeScript繼承也支持重載方法,只要在子類中從新定義與父類同名(參數不要求匹配)的方法便可。同時,在重載方法內部,能夠使用super()函數

相關文章
相關標籤/搜索