Как вызвать метод класса в пределах цикла forEach?

Как можно исправить ошибку Uncaught TypeError: Cannot read properties of undefined (reading 'totalWithDelivery') на строке, где вызывается метод totalWithDelivery в классе Calc?
  • 26 января 2025 г. 14:04
Ответы на вопрос 1
Чтобы вызвать метод класса в пределах цикла `forEach`, вам нужно убедиться, что контекст (значение `this`) правильно установлен. Это можно сделать, например, используя стрелочную функцию, которая сохраняет контекст родительской функции.

Если у вас есть класс `Calc` с методом `totalWithDelivery`, и вы хотите его вызвать внутри цикла `forEach`, вы можете сделать что-то вроде этого:

```javascript
class Calc {
    constructor() {
        this.total = 0; // Пример свойства класса
    }

    totalWithDelivery() {
        // Реализация метода
        return this.total + 100;  // Просто пример, добавляем 100 за доставку
    }
}

const calc = new Calc();
const arrayOfItems = [1, 2, 3]; // Пример массива

arrayOfItems.forEach(item => {
    console.log(calc.totalWithDelivery()); // Вызов метода класса
});
```

В этом примере мы создаем экземпляр класса `Calc`, а затем вызываем метод `totalWithDelivery` для каждого элемента массива `arrayOfItems` в цикле `forEach`.

Теперь относительно ошибки `Uncaught TypeError: Cannot read properties of undefined (reading 'totalWithDelivery')`. Эта ошибка возникает, когда вы пытаетесь вызвать метод `totalWithDelivery` у переменной, которая равна `undefined`, или из неверного контекста. Убедитесь, что вы вызываете метод у корректного экземпляра класса.

Если у вас есть код, где метод вызывается из другого места, убедитесь, что вы правильно ссылаетесь на экземпляр класса. Например, не стоит делать так:

```javascript
arrayOfItems.forEach(function(item) {
    console.log(this.totalWithDelivery()); // Здесь this будет undefined!
});
```

В этом случае `this` не указывает на экземпляр класса. Если вы хотите использовать обычную функцию, вы можете использовать `bind`:

```javascript
arrayOfItems.forEach(function(item) {
    console.log(this.totalWithDelivery());
}.bind(calc));
```

Либо, как уже упоминалось ранее, используйте стрелочную функцию:

```javascript
arrayOfItems.forEach(item => {
    console.log(calc.totalWithDelivery());
});
```

Убедитесь, что `totalWithDelivery()` вызывается у правильно инициализированного объекта класса.
Похожие вопросы