2017-05-09 7 views
0

私は、私がかなり重要だと思う方法を知らないことに気付きました。これは、 'サブクラス'、つまりインスタンス上の入れ子オブジェクトを作成することですそのインスタンスを参照する関数を持っています。次のコードを使用してオブジェクトのNestクラスのメソッドがインスタンスのスコープを維持する

sequence = new Sequencer(2, [true, true]) 
sequence.is_valid # returns true or false 

たとえば、私はこれを行うことができるようにしたいと思い

class Sequencer 

    Validations: 

    correct_sequence_length: -> 
     @division == @sequence.length 

    positive_length: -> 
     @division > 0 

    constructor: (args) -> 
    { @sequence, @division } = args 

    is_valid: -> 
    @Validations.correct_sequence_length() &&\ 
    @Validations.positive_length() 

Validationsがオブジェクトであるため、それは、それはそれ自身を持っているように見えることがそのメソッドのthisはインスタンスを参照するのではなく、Validationsオブジェクトを参照します。つまり、@sequenceまたは@tempoにアクセスできません。私も矢印機能を使ってみましたが、うまくいきませんでした。

これを処理してValidationsを独自のクラスにする最良の方法はありますか?

+0

のCoffeeScriptを使用すると、validationsオブジェクトをしなかった場合


アロー機能が働くだろうまたはES6?決定してください、彼らはかなり異なっています。 – Bergi

+0

プロパティをネストする場合は[はい、余分なクラスが必要です](http://stackoverflow.com/q/15884096/1048572)。 – Bergi

+0

@Bergi私はcoffeescriptが好きですが、v2はES6クラスを出力するので、必ずしも無関係ではありません。とにかく私はそれを見て興味があると思うだろうが、あなたはES6で動作するソリューションを持っています。 –

答えて

0

はい、あなたはSequencerへの参照が含まれている余分なクラスが必要になります:

class Sequencer 

    @Validations: class 
    constructor: (@target) -> 

    correct_sequence_length: -> 
     @target.division == @target.sequence.length 

    positive_length: -> 
     @target.division > 0 

    constructor: ({ @sequence, @division }) -> 
    @validations = new Sequencer.Validations(@) 

    is_valid: -> 
    @validations.correct_sequence_length() && 
    @validations.positive_length() 

は(便宜上私はSequencerの静的プロパティとしてそれを入れ子になったが、そのための必要はありません)。

class Sequencer 

    constructor: ({ @sequence, @division }) -> 

    validations: -> 
#    ^^^^ 
    correct_sequence_length: => 
     @division == @sequence.length 

    positive_length: => 
     @division > 0 

    is_valid: -> 
    v = @validations() 
    v.correct_sequence_length() && v.positive_length() 

あなたが同様にコンストラクタで矢印の機能とそのオブジェクトを作成することができます:

class Sequencer 

    constructor: ({ @sequence, @division }) -> 
    @validations = 
     correct_sequence_length: => 
     @division == @sequence.length 
     positive_length: => 
     @division > 0 

    is_valid: -> 
    @validations.correct_sequence_length() && 
    @validations.positive_length() 
関連する問題