Nilai dari fungsi dalam instance konstruktor tidak dapat diakses dalam javascript

Konstruktor 'ini.A' membuat instance yang kemudian dikirim ke konstruktor 'ini.b'. Sebuah array dikompilasi dari kedua instance konstruktor. Nilai dari instance 'this.b' tidak dapat diakses dari array tempat mereka disimpan. Kesalahan 'Tidak dapat mendapatkan properti 'kalkulasi' yang tidak ditentukan' diterima. Namun nilai dapat diakses di akhir setelah array diisi. Ini sudah usang karena 'var data' adalah aliran nilai yang tidak ada habisnya sehingga array terus diisi.

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 sumber


Jawaban (2)


Masalahnya ada pada pengindeksan array Anda. Dalam fungsi "perbarui", Anda memulai dengan menambah "waktu". Ini berarti Anda sebenarnya melewatkan entri pertama dalam aliran data Anda, dan langsung menuju entri kedua. Saat Anda memasukkan nilai pada ArrayA dan ArrayB, nilai tersebut disimpan pada indeks 1 lebih rendah daripada yang Anda ambil dari aliran data.

Singkatnya, Anda harus menambah waktu di akhir fungsi pembaruan, bukan sebelumnya. Anda dapat dengan cepat memverifikasi kebenarannya dengan mengubah baris ini menjadi

this.arrayB[time - 1].calc()
person Guillaume CR    schedule 23.08.2018
comment
Terima kasih banyak, perbaikan yang sangat sederhana. Saya mengubah this.time = 0 menjadi -1 dan berfungsi dengan baik. - person moo5e; 23.08.2018

Oke, jadi saat pertama kali Anda menjalankan fungsi pembaruan, Anda mendorong ke arrayB sehingga ada satu item di dalamnya. Karena Anda mengakses array dengan variabel waktu, maka harus sama dengan nol untuk mendapatkan item pertama dalam array. Namun, Anda menambahkan satu ke variabel waktu di awal fungsi. Jadi Anda mencoba mengakses item yang tidak ada, maka Anda menjadi tidak terdefinisi dan mencoba memanggil fungsi kalk pada tidak terdefinisi.

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