2016-11-30 4 views
0

私は、オブジェクトの委譲パターンを使用してRangeSeq2を作成し、クラスのような方法(ArraySeq2)から離れたいが、 という配列オブジェクトをArraySeq2またはRangeSeq2のような繰り返しオブジェクトlogFive2を使用して、 。私がRangeSeq2に間違っていることは何ですか? LogFive2はRangeSeq2を反復処理しないため、私のコードは動作しません。理由はわかりません。何が間違っているのか分かっているなら、私に見せてください。ありがとうございました。クラスOOからオブジェクト委譲パターンへのシーケンス

function logFive2(sequence){ 
    for(var i = 0; i < 5 && sequence != null; i++){ 
     console.log(sequence.head()); 
     sequence = sequence.rest(); 
    } 
    } 

function ArraySeq2(array,offset){ 
     this.array = array; 
     this.offset = offset; 
    } 

    ArraySeq2.prototype.rest = function(){ 
     console.log("to follow " + this.offset); 
     return ArraySeq2.make(this.array,this.offset + 1); 
    }; 

    ArraySeq2.prototype.head = function(){ 
     return this.array[this.offset]; 
    }; 

    ArraySeq2.make = function(array,offset){ 
     if(offset == null) offset = 0; 
     if(offset >= array.length) 
     return null; 
     else return new ArraySeq2(array,offset); 
    } 
    logFive2(ArraySeq2.make([1, 2,5,6,9,11])); 
    // → 1 
    // → 2 

上記の一部が正常に動作します______________それは私の問題を整理

var RangeSeq2 = { 
     init: function(from,to){ 
     this.from = from; 
     this.to = to; 
     }, 
     rest: function(){ 
     if (from > to) 
      return null; 
     else 
      return this.init(this.from + 1,this.to); 
     }, 
     head: function(){ 
     return this.from; 
     } 
    }; 

    var RangeTT = Object.create(RangeSeq2); 
    RangeTT.init(100,1000); 
    logFive2(RangeTT.init(100,1000)); 
+0

どのようなエラーが表示されますか? –

+0

私は何の誤りもなく、私が間違っていることを見ることができません。 –

答えて

0
function logFive2(sequence){ 
    for(var i = 0; i < 5 ; i++){ 
     console.log(sequence.head()); 
     sequence.rest(); 
    } 
    } 

    var RangeSeq2 = { 
     rest: function(){ 
     if (this.from > this.to) { 
      return null; 
     } 
     else 
      return this.from += 1,this.to; 
     }, 
     head: function(){ 
     return this.from; 
     } 
    }; 

    var RangeTT = Object.create(RangeSeq2); 
    RangeTT.from = 100; 
    RangeTT.to = 1000; 
    logFive2(RangeTT); 
    //100 
    //101 
    //102 
    //103 
    //104 

されているオブジェクトRangeSeq2!問題は思ったよりずっと簡単でした。 私の問題は、オブジェクトの委譲に対して古典的な継承とインスタンス化の不健全な混在を試みることでした。なぜなら、それがどのように動作するのか分からなかったからです。 すぐに「これ」がどのように機能し、すぐに私はObject.create(非常に強力です)、__proto__を理解し、Object.prototype関数との違いを知っていました。

私の最初の間違いはオブジェクトの中に値を保持するプロパティを持たずにメソッドinit()を呼び出すことによってオブジェクト内に状態を作成しようとしていたと思います。

2. rest()メソッドは、オブジェクトに存在しない変数を照会します。

私のケースではオブジェクトの委譲設計に適した反復子関数LogFive2()を変更しなければならないことに言及する必要があります。

関連する問題