有一點需要注意的是,OpenLayers中的對象系統使用一個名爲initialize()的函數作爲構造函數,所以爲了在擴展OpenLayers類時讓CoffeeScript的超級關鍵字正確工作,您需要裝飾它們。我用下面的功能是:
window.CompatibleClass = (cls) ->
class Wrapped
constructor: ->
# Call the OpenLayers-style constructor.
cls::initialize.apply @, arguments
# Copy prototype elements from OpenLayers class.
Wrapped::[name] = el for name, el of cls::
Wrapped
現在,您可以擴展內置像這樣的OL:
class MySpecialFeature extends (CompatibleClass OpenLayers.Feature.Vector)
constructor: ->
super new OpenLayers.Geometry.Point 0, 0
CLASS_NAME: "MySpecialFeature"
編輯:只是爲了澄清,這兩個替代包裝類像這樣就是按原樣使用OpenLayers類系統,並且錯過了CoffeeScript的一些語法優點,或者在每個構造函數中手動調用初始化函數,這會感覺更脆弱,並圍繞依賴進行傳播,而不是集中它在一個裝飾器中。
使用的OpenLayers類系統原樣,在CoffeeScript的:
MySpecialFeature = OpenLayers.Class OpenLayers.Feature.Vector,
initialize: ->
# Call super using apply, as is convention in OpenLayers
OpenLayers.Feature::initialize.apply @, new OpenLayers.Geometry.Point 0, 0
...
...
或者,使用的CoffeeScript類,但延伸的的OpenLayers類未飾:
class MySpecialFeature extends OpenLayers.Feature.Vector
constructor: ->
# Call inherited initialize().
@initialize.apply @, new OpenLayers.Geometry.Point 0, 0
...
...
這些方法都不將與其他開發者一樣習慣或認可,無論是OpenLayers還是CoffeeScript。我支持我的一個包裝的建議,它允許本地super()用於調用OpenLayers構造函數。
太棒了!我不敢相信我現在只是找到這些東西。 –