Не в состоянии использовать метод внутри класса

#javascript #class #recursion #matrix #typeerror

Вопрос:

Я пытаюсь создать матричный класс. Функция cof() не работает, когда я использую ее в качестве метода и показываю эту ошибку.
практика:47 Неперехваченная ошибка типа: Не удается прочитать свойство «cof» неопределенного.

Но когда я использую его внутри метода det() как функцию, он работает идеально. Кто-нибудь может объяснить, почему это происходит?

 class Matrix{
 
 constructor(matrix){
     this.matrix = matrix
 }   
 
 cof(matrix = this.matrix, i, j) {
    let cofMat = matrix.map(row =>
      row.filter((_, colIndex) => j !== colIndex)
    )
    cofMat.splice(cofMat[i],1)
    return cofMat
  }
     
 det(matrix = this.matrix) {
  let validInput = true;

  //input validation
  let columnLength = matrix.length;
  matrix.forEach((row) =>
    row.length === columnLength ? (validInput = true) : (validInput = false)
  );
  if (!validInput) return "Input a valid n*n matrix";

  // determining the matrix using 1st row.

  // This function is not working properly as a method

  function cof(matrix, i, j) {
    let cofMat = matrix.map(row =>
      row.filter((_, colIndex) => j !== colIndex)
    )
    cofMat.splice(cofMat[i],1)
    return cofMat
  }

  function recursiveDeterminantMatrix(matrix) {
    if (matrix.length === 2 amp;amp; matrix[0].length === 2) {
      let result = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
      return resu<
    } else {
      let answer = 0;
      for(let i =0; i< matrix.length; i  ) {
        let cofactor =
          (-1) ** i *
          matrix[0][i] *
          recursiveDeterminantMatrix(this.cof(matrix, 0, i));
        answer  = cofactor;
      };
      return answer;
    }
  }

  return recursiveDeterminantMatrix(matrix);
 }  
}

let matrix = [[1,2,3],[4,5,6],[7,8,8]];

let mat = new Matrix(matrix).det()
 

Ответ №1:

Для этого вы можете использовать привязку.

 recursiveDeterminantMatrix(this.cof(matrix, 0, i).bind(this));
 

Комментарии:

1. @sadat-saim вы можете отметить ответ как принятый, нажав на галочку, если это помогло вам 😀

Ответ №2:

Когда recursiveDeterminantMatrix функция выполняется, this она не вычисляется для экземпляра класса, потому что это не метод, а просто обычная функция.

Вы можете сохранить экземпляр класса в self переменной для правильного использования во внутренней функции.

 det(matrix = this.matrix) {
 const self = this;

 // ...

 function recursiveDeterminantMatrix(matrix) {
   if (matrix.length === 2 amp;amp; matrix[0].length === 2) {
     let result = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
     return resu<
   } else {
     let answer = 0;
     for(let i =0; i< matrix.length; i  ) {
       let cofactor =
         (-1) ** i *
         matrix[0][i] *
         recursiveDeterminantMatrix(self.cof(matrix, 0, i));
       answer  = cofactor;
     };
     return answer;
   }
 }

 return recursiveDeterminantMatrix(matrix);
} 
 

Для получения дополнительной информации о this ключевом слове, пожалуйста, ознакомьтесь с документами MDN