Одна небольшая ошибка, о которой следует знать, это то, что объектная система в OpenLayers использует функцию initialize () в качестве конструктора, поэтому, чтобы супер-ключевое слово CoffeeScript работало правильно при расширении классов OpenLayers, вам необходимо декорировать их. Для этого я использую следующую функцию:
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.