理想情况下,我想执行以下操作:
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。您可以做的是拥有两个单独的类Chess
和ChessSquare
-并引用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
的所有实例。