Значения функций в экземплярах конструктора недоступны в javascript.

Конструктор this.A создает экземпляры, которые затем отправляются конструктору this.b. Массив составляется из обоих экземпляров конструктора. Доступ к значениям из экземпляров this.b из массива, в котором они хранятся, невозможен. Получена ошибка «Невозможно получить свойство 'calc' of undefined». Однако доступ к значениям можно получить в конце после заполнения массива. Это устарело, поскольку «var data» — это бесконечный поток значений, поэтому массивы постоянно заполняются.

var data = [-1,1,4,3,-3,-4,1,-4];

function init() {
  this.A = function(value, time) {
    this.value = value;
    this.time = time
  }
  this.B = function(point, array) {
    this.calc = function() {
      var x = point.value;
        if(x>=0){
          return 'positive'
        } else {
          return 'negative'
        }
    }
  }
  this.time = 0;
  this.arrayA = [];
  this.arrayB = [];
}

function update (datastream) {
    var time = this.time += 1;
    var value = datastream[time];
    var x = new this.A(value, time);
    var y = new this.B(x, this.arrayA);
    this.arrayA.push(x);
    this.arrayB.push(y);
    //error:
    console.log(this.arrayB[time].calc())
}

function finish() {
  for(let x=0; x < data.length; x++) {
    console.log(this.arrayB[x].calc())
  }
}

init();
for(let x=0; x < data.length; x++) {
  update(data)
};
finish()

person moo5e    schedule 23.08.2018    source источник


Ответы (2)


Проблема в индексации вашего массива. В вашей функции «обновления» вы начинаете с увеличения «времени». Это означает, что вы фактически пропускаете первую запись в своем потоке данных и переходите сразу ко второй. Когда вы отправляете значения в свои массивы ArrayA и ArrayB, они сохраняются с индексом на 1 ниже, чем вы извлекаете из своего потока данных.

Короче говоря, вы должны увеличивать время в конце вашей функции обновления, а не раньше. Вы можете быстро убедиться, что это правда, изменив эту строку на

this.arrayB[time - 1].calc()
person Guillaume CR    schedule 23.08.2018
comment
Большое спасибо, очень простое решение. Я изменил this.time = 0 на -1, и все заработало. - person moo5e; 23.08.2018

Итак, при первом запуске функции обновления вы отправили массив B, чтобы в нем был один элемент. Поскольку вы обращаетесь к массиву с переменной времени, она должна быть равна нулю, чтобы получить первый элемент в массиве. Однако вы добавляете единицу к переменной времени в начале функции. Итак, вы пытаетесь получить доступ к элементу, который не существует, поэтому вы получаете неопределенное значение и пытаетесь вызвать функцию calc для неопределенного.

console.log(this.arrayB[time - 1].calc())
person yaron miron    schedule 23.08.2018