У меня есть класс marketData:

export class marketData {
    id: number;
    denomCount: number;
    itemCount: number;
    conversionRates: Array<number> = [];
    conversionRateToLowest: Array<number> = [];
    itemPrices: Array<Array<number>> = [];
}

Я хотел бы определить для него функцию-член validate(), которая проверяет, что значения класса установлены правильно. Я написал часть этого метода для проверки itemPrices:

this.itemPrices.forEach(function(this, prices){
          if(prices.length != this.itemCount){
              // handle error 
          });

Однако вышесказанное дает мне ERROR TypeError: "this is undefined". Я получил ту же ошибку при попытке проверить itemPrices следующим образом:

this.itemPrices.forEach(function(prices){
          if(prices.length != this.itemCount){
              // handle error
          });

То есть без this в параметрах function.

Как правильно получить доступ к переменной-члену itemCount?

1
L L 3 Май 2019 в 05:55

3 ответа

Лучший ответ

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

this.itemPrices.forEach((prices) =>{
          if(prices.length != this.itemCount){
              // handle error
            }
});
2
Manish 3 Май 2019 в 03:03

Значение this в функции отличается от значения внутри класса. Вы можете использовать функцию жирной стрелки или bind(this), чтобы связать функцию с классом.

this.itemPrices.forEach(function(prices){ if(prices.length != this.itemCount){ // handle error }).bind(this);

0
Sachin Gupta 3 Май 2019 в 03:00

Вы можете использовать функции стрелок в ES6. чтобы получить доступ к this. В любом случае, прочитайте этот до udnerstand в контексте this, когда дело доходит до JavaScript и использования их в ООП в JS.

this.itemPrices.forEach((prices: number) => {
  if (prices.length != this.itemCount){
    // handle error 
  });
});
1
wentjun 3 Май 2019 в 03:33