1

Prototype のクラスベースの OOP システムを使用する素晴らしいRickshawライブラリで遊んでいます。これには、サブクラスが次のように親クラスのメソッドを拡張できるようにするメソッドが含まれます。extend

親クラス:

defaults: function() {
  return {
    tension: 0.8,
    // etc...
  };
}

サブクラス:

defaults: function($super) {
  return Rickshaw.extend( $super(), {
    fill: true,
    // etc...
  } );
}

CoffeeScript で同じことを行うための構文を見つけようとしているので、CoffeeScript はプロトタイプではなくクラスの継承を処理します。手伝ってくれますか?

編集

@tomahaug の回答のおかげで、これが機能するようになりました。より良い方法があることに気付きました。While$superはプロトタイプ機能ですextendが、実際にはプロトタイプ人力車のトップレベル オブジェクトの両方で次のように定義されています。

extend: (destination, source) ->
  for property of source
    if (source.hasOwnProperty(property))
      destination[property] = source[property]
  destination

したがって、この方法を使用すると、ソリューションは次のようになります。

defaults: () ->
  Rickshaw.extend super(), 
    fill: true,
    // etc...

したがって、これを別のステップで改善できる唯一の方法は、これが何らかの方法で CoffeeScript に組み込まれていることが判明した場合です。

4

2 に答える 2

4

親メソッドを呼び出して、結果が返される前により多くの情報で装飾したい場合は、純粋な CoffeeScript で次のように実行できます。

class Parent
  defaults: () ->
    return {
       tension: 0.8
    }

class Sub extends Parent
  defaults: () ->
    r = super
    r.fill = true

    return r

sub = new Sub 

sub.tension # 0.8
sub.fill # true

http://underscorejs.org/のようなライブラリを使用すると、おそらく少しきれいになります。

  defaults: () ->
    _.extend super, {
      fill: true
    }
于 2013-09-06T12:46:58.197 に答える
0

これら 2 つの CoffeeScript 構文は次のようになります。

親クラス:

defaults: () ->
    return {
        tension: 0.8,
        # etc ...
    }

サブクラス:

defaults: ($super) ->
    return Rickshaw.extend $super(), {
        fill: true,
        # etc...
    }

これは、CoffeeScript でコードを記述する多くの方法の 1 つにすぎないことに注意してください。

また、 CoffeeScript には暗黙の return があることを覚えておいてください。そのためreturn、メソッドに次のコードが含まれていない場合は、どちらの場合でも を削除できます。

于 2013-09-06T12:32:49.400 に答える