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]
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]
一般に、これはコードを追加しなくても機能します。明示的にオーバーライドされない限り、親コンストラクターが使用されます。
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
で のコンストラクターを呼び出します。
class List extends Array
constructor: ->
@push arguments...
toString: ->
@join('-')
list = new List(1, 2)
list.push(3)
list.toString()
=>
「1-2-3」
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)
考え?コメント? 提案?私が考えていなかった制限?お知らせ下さい。