ไม่สามารถเข้าถึงค่าจากฟังก์ชันในอินสแตนซ์ Constructor ในจาวาสคริปต์

ตัวสร้าง 'this.A' สร้างอินสแตนซ์ที่ถูกส่งไปยังตัวสร้าง 'this.b' อาร์เรย์ถูกคอมไพล์จากอินสแตนซ์คอนสตรัคเตอร์ทั้งสอง ไม่สามารถเข้าถึงค่าจากอินสแตนซ์ 'this.b' จากอาร์เรย์ที่เก็บไว้ ได้รับข้อผิดพลาด 'ไม่สามารถรับคุณสมบัติ 'คำนวณ' ของไม่ได้กำหนด' อย่างไรก็ตามคุณสามารถเข้าถึงค่าได้ในตอนท้ายหลังจากกรอกอาร์เรย์แล้ว สิ่งนี้ล้าสมัยเนื่องจาก '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)


ปัญหาอยู่ในการจัดทำดัชนีอาร์เรย์ของคุณ ในฟังก์ชัน "อัปเดต" คุณเริ่มต้นด้วยการเพิ่ม "เวลา" ซึ่งหมายความว่าคุณกำลังข้ามรายการแรกใน datastream ของคุณ และไปที่รายการที่สองโดยตรง เมื่อคุณพุชค่าบน 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

โอเค ดังนั้นในการรันฟังก์ชันอัพเดตครั้งแรก คุณได้พุชไปที่ arrayB เพื่อให้มีหนึ่งรายการในนั้น เนื่องจากคุณกำลังเข้าถึงอาร์เรย์ด้วยตัวแปรเวลา จึงควรเท่ากับศูนย์เพื่อรับไอเท็มแรกในอาร์เรย์ อย่างไรก็ตาม คุณเพิ่มหนึ่งตัวแปรลงในตัวแปรเวลาที่จุดเริ่มต้นของฟังก์ชัน คุณกำลังพยายามเข้าถึงรายการที่ไม่มีอยู่ ดังนั้น คุณจึงไม่ได้กำหนดไว้ และพยายามเรียกใช้ฟังก์ชัน calc เมื่อไม่ได้กำหนด

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