在CoffeeScript中,使用class
定義類,使用關鍵字new
實例化對象。javascript
class Airplane takeOff: -> console.log 'Vrroom!' plane = new Airplane() plane.takeOff()
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()
函數