10

CoffeeScriptを使用してクラスをどのように拡張しますが、構築引数をsuperに渡しますか?

例えば:

class List extends Array
    # Some other stuff to make it work...

list = new List(1,2,3)

console.log list
[1、2、3]
4

4 に答える 4

24

一般に、これはコードを追加しなくても機能します。明示的にオーバーライドされない限り、親コンストラクターが使用されます。

class A
  constructor: ->
    console.log arg for arg in arguments

class B extends A

new B('foo') # output: 'foo'

constructor問題は、Array にメソッドがないことではありません。

coffee> Array.constructor
[Function: Function]

問題は、それArray単に奇妙であることです。配列は原則として「単なるオブジェクト」ですが、実際には異なる方法で格納されます。したがって、そのコンストラクターを配列ではないオブジェクトに適用しようとすると (instanceof Arrayテストに合格した場合でも)、機能しません。

したがって、Acorn のソリューションを使用することはできますが、後で他の問題に遭遇する可能性があります (特にList、真の配列を期待するものに a を渡す場合)。そのため、Listネイティブ オブジェクト型からの継承を使用するよりも、配列インスタンスのラッパーとして実装することをお勧めします。

この件に関しては、非常に重要な説明superが 1 つあります。単独で使用すると、すべての引数渡されます。この動作は Ruby から借用されています。そう

class B extends A
  constructor: ->
    super

すべての引数をAのコンストラクターに渡しますが、

class B extends A
  constructor: ->
    super()

引数なしAで のコンストラクターを呼び出します。

于 2011-05-10T19:37:00.947 に答える
8
class List extends Array
    constructor: ->
        @push arguments...

    toString: ->
        @join('-')

list = new List(1, 2)

list.push(3)

list.toString()

=>

「1-2-3」
于 2011-05-10T17:47:49.130 に答える
-1

JavaScript の調査では、動的な数のコンストラクター引数を持つクラスを作成する汎用的な方法が必要でした。前述のように、これは私の知る限り、配列では機能しません。コーヒー スクリプト スタイルのクラスでのみ機能します。

動的な数の引数を指定して特定の関数を呼び出すのは簡単です。.apply

args = [1, 2, 3]
f = measurement.clone

f.apply measurement, args

クラスは、変数に保存されたクラスを拡張できます。その結果、新しいサブクラスを返す関数を書くことができます。

classfactory = (f) ->
    class extension extends f

すべてをまとめるとapply、スーパークラスのコンストラクターに引数を与える新しいサブクラスを返す関数を作成できます。

classwitharguments = (f, args) ->
    class extension extends f
        constructor: () ->
            extension.__super__.constructor.apply @, args

この新しい工場を使用するには

args = [1, 2, 3]
instance = new (classwitharguments Measurement, args)

考え?コメント? 提案?私が考えていなかった制限?お知らせ下さい。

于 2012-10-15T17:52:14.937 に答える