OpenLayersのオブジェクトシステムでは、initialize()という関数をコンストラクタとして使用しているため、OpenLayersクラスを拡張するときにCoffeeScriptのsuperキーワードを正しく動作させるには、それらを飾る。私はこのために次の関数を使用します。
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"
EDIT:ちょうどクラスをラップする、二つの選択肢を明確にしますOpenLayersクラスのシステムをそのまま使用し、CoffeeScriptの構文上の利点のいくつかを見逃したり、各コンストラクタで手作業でinitialize関数を呼び出すことがあります。これは、より脆く感じて、依存性の周囲に広がりますそれは単一のデコレータで。
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をクラス未装飾延びる:のCoffeeScriptで、そのままOpenLayersをクラスシステムを使用
class MySpecialFeature extends OpenLayers.Feature.Vector
constructor: ->
# Call inherited initialize().
@initialize.apply @, new OpenLayers.Geometry.Point 0, 0
...
...
をこれらの方法のいずれも意志OpenLayersまたはCoffeeScriptのいずれかの他の開発者には、慣用的または認識可能である必要があります。私は、OpenLayersコンストラクタを呼び出す際にネイティブのsuper()を使用できるようにするラッパーを推奨しています。
awesome!私は今、この物を見つけているとは信じられません。 –