无法在类中使用方法

Posted

技术标签:

【中文标题】无法在类中使用方法【英文标题】:Not able to use a method inside a class 【发布时间】:2021-11-03 21:33:38 【问题描述】:

我正在尝试制作一个矩阵类。当我将 cof() 函数用作方法并显示此错误时,它不起作用。practice:47 Uncaught TypeError: Cannot read property 'cof' of undefined。

但是当我在 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()

【问题讨论】:

【参考方案1】:

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 Docs

【讨论】:

【参考方案2】:

您可以为此使用绑定。

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

【讨论】:

@sadat-saim 如果这对您有帮助,您可以通过单击复选标记将答案标记为已接受:D

以上是关于无法在类中使用方法的主要内容,如果未能解决你的问题,请参考以下文章

在类中使用 ProcessPoolExecutor 时无法腌制协程对象

使用受保护和继承时无法访问在类中声明的私有成员

绕过错误 C2248“无法访问在类中声明的受保护成员”的有效方法

尽管在类中声明了变量,但无法在范围内找到

无法从数组中打印信息,无法弄清楚如何遍历存储在类中的数组?

C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]