Работа с полями и методами объекта java script

138
25 октября 2019, 18:00

есть вот такой вот код:

class Book { 
  constructor() { 
    this.param1 = 1; 
    this.param2 = []; 
    this.param3 = this.summ(); 
  } 
  summ() { 
    console.log(`summ started`); 
    let a = 0; 
    this.param2.forEach((obj) => { 
      a += obj.val 
    }); 
    return a 
  } 
  addArray(obj) { 
    this.param2.push(obj) 
  } 
 
} 
let arr = [{ 
  val: 1 
}, { 
  val: 2 
}, { 
  val: 3 
}, ]; 
let book = new Book(); 
book.addArray(arr); 
console.log(book.param3);

Не могу понять, из-за чего, третий параметр - ndefined... В случае, если метод возвращает сумму значений параметров - все ок... Как забороть ?

Answer 1

Потому что param3 вычисляется здесь:

let book = new Book();

и не обновляется после вызова

book.addArray(arr);
  addArray(obj) {
    obj.forEach(el => this.param2.push(el));
    this.param3 = this.summ();
  }

class Book { 
  constructor() { 
    this.param1 = 1; 
    this.param2 = []; 
    this.param3 = this.summ(); 
  } 
  summ() { 
    console.log(`summ started`); 
    let a = 0; 
    this.param2.forEach((obj) => { 
      a += obj.val 
    }); 
    return a 
  } 
  addArray(obj) { 
    obj.forEach(el => this.param2.push(el)); 
    this.param3 = this.summ(); 
  } 
 
} 
let arr = [ 
  { val: 1 },  
  { val: 2 }, 
  { val: 3 } 
]; 
let book = new Book(); 
book.addArray(arr); 
console.log(book.param3);

Answer 2

Реализуйте поле через getter:

class Book { 
    constructor() { 
        this.param1 = 1; 
        this.param2 = []; 
    } 
 
    get param3() { 
        console.log(`summ started`); 
        let result = this.param2.reduce((acc, cur) => acc += cur.val, 0); 
        return result; 
    } 
 
    addArray(obj) { 
        this.param2.push(...obj); 
    } 
} 
 
let arr = [{ 
    val: 1 
}, { 
    val: 2 
}, { 
    val: 3 
}]; 
 
let book = new Book(); 
book.addArray(arr); 
console.log(book.param3);

READ ALSO
Как правильно использовать Array.filter с typescript?

Как правильно использовать Array.filter с typescript?

Мне нужно удалить все boolean значения из массива, и оставить только строки(массива состоит из boolean и string), хочу сделать это методом filter, но typeScript...

139
Передается только 1 option

Передается только 1 option

Подскажите пожалуйста, выполняю post запрос, но передается только client, waiter не передаетсяВ чем может быть проблема?

117
Input required ajax post

Input required ajax post

Подскажите пожалуйста, как сделать обязательный input при выполнении post формы ajax?

117
AJAX JQUERY Не читается ответ

AJAX JQUERY Не читается ответ

Нужно выполнить тривиальную задачу, послать AJAX запрос на сервер и прочитать ответ, но при чтении ответа возникает ошибка, хотя сам запрос...

123