理想情况下,我想执行以下操作:

class Chess = {
  constructor() {
    this.board = ...;
    ...
  };

  class Square = {
    constructor(row, col) {
      this.row = row;
      this.col = col;
  };
};

我的主要动机是在分别定义Chess和Square类的情况下,如下所示:(这指的是Chess类)
this.empty(square)

可以缩短为
square.empty()

更具可读性和简洁性。

不幸的是,我不能只做一个
Square.empty()

方法,因为结果取决于国际象棋类中的信息,并且
square.empty(chess)

并没有真正的改善。

我参加Square课的原因是
square.up()

似乎比类似的东西要好得多
[row, col + 1]

您对我如何实现上述目标有何建议?用某种方法在一个类中编写一个类,或者完全用其他方式写?

编辑:

遵循likle和alex的建议,我做了以下工作:

我将上下文属性添加到类(class)广场
class Square = {
  constructor(context, row, col) {
    this.context = context;
    this.row = row;
    this.col = col;
  };
};

然后将一些方法从Chess.prototype重新定义为Square.protoype。例如:
// before
Chess.prototype.empty = function (square) {
  return this.piece(square) === 0;
};

// after
Square.prototype.empty = function () {
  return this.piece() === 0;
};

这意味着每次我创建一个Square对象时,我都需要添加上下文。例如:
new Square(3, 4); // before
new Square(this, 3, 4); // after
new Square(this.context, 3, 4); // sometimes like this

为了使代码更具可读性,我创建了以下方法:
Chess.prototype.createSquare = function (row, col) {
  return new Square(this, row, col);
};

因此,有时可以使用以下方式创建Square对象
this.createSquare(3, 4);

最佳答案

当前,存在are no nested classes。您可以做的是拥有两个单独的类ChessChessSquare-并引用ChessSquare的构造函数中传递的象棋,并将其存储为属性。这样,您就不必在ChessSquare的方法中传递它:

  class ChessSquare = {
    constructor(chess, row, col) {
      this.chess = chess;
      this.row = row;
      this.col = col;
    }

    empty() {
      // "this.chess" references the chess, and "this" references the square.
    }
  };

您可能想在ChessSquare类本身内创建Chess的所有实例。

09-25 20:17