Последовательность от класса OO до шаблона делегирования объекта

Мое намерение состоит в том, чтобы использовать функцию logFive2 для итерации объекта последовательности, такого как ArraySeq2 или RangeSeq2, хотя я хочу создать RangeSeq2, используя шаблон делегирования объекта, и держаться подальше от класса как (ArraySeq2). Что я делаю не так с 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 ответ

Решение
 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, потому что я не понимал, как это работает. Вскоре мне удалось понять, как работает "это", и вскоре я понял Object.create (который является очень мощным), __proto__ и понял разницу, по сравнению с функцией Object.prototype, и смог найти решение.

1. Моей первой ошибкой, по-моему, была попытка создать состояние в объекте, вызвав метод init(), не имея свойства для хранения значений в объекте.

2. Метод rest() будет запрашивать переменные, которые не существуют в объекте.

Я должен упомянуть, что мне пришлось изменить функцию итератора LogFive2(), чтобы она подходила для проектирования делегирования объектов в моем случае.

Другие вопросы по тегам