从类OO到对象委托模式的序列

时间:2016-11-30 12:23:47

标签: javascript object sequence delegation

我的目的是使用函数logFive2进行迭代 虽然我想使用对象委托模式创建RangeSeq2并远离类似方式(ArraySeq2),但是像ArraySeq2或RangeSeq2这样的序列对象。我对RangeSeq2做错了什么?  我的代码不起作用,因为logFive2不会迭代RangeSeq2而我看不清楚原因。如果您对出了什么问题有任何疑问,请让我看看。谢谢。

   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

以上部分工作正常______________ RangeSeq2对象是我的问题

    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));

1 个答案:

答案 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

整理出来!问题比我想象的要简单得多。 我的问题是试图对对象委托进行经典继承和实例化的不健康混合,因为我不明白它是如何工作的。 很快我就理解了“这个”是如何工作的,很快我就理解了Object.create(非常强大),__ proto__并且知道它与函数Object.prototype的区别,我可以找到解决方案。

1.我认为第一个错误是尝试通过调用方法init()来创建对象中的状态,而没有用于保存对象中的值的属性。

2. rest()方法将查询对象上不存在的变量。

我必须提一下,在我的情况下,我必须更改迭代器函数LogFive2()以适合对象委托设计。