开发者问题收集

无法使用类内的方法

2021-09-06
54

我正在尝试创建一个矩阵类。当我将 cof() 函数用作方法时,该函数不起作用并显示此错误。
practice:47 Uncaught TypeError:无法读取未定义的属性“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 && matrix[0].length === 2) {
      let result = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
      return result;
    } 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()
2个回答

recursiveDeterminantMatrix 函数执行时, this 不会计算类的实例,因为它不是方法,只是一个简单的函数。

您可以将类的实例保存在 self 变量中,以便在内部函数中正确使用。

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

 // ...

 function recursiveDeterminantMatrix(matrix) {
   if (matrix.length === 2 && matrix[0].length === 2) {
     let result = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
     return result;
   } 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 文档

Guerric P
2021-09-06

您可以使用 bind 来实现这一点。

recursiveDeterminantMatrix(this.cof(matrix, 0, i).bind(this));
Phaki
2021-09-06