В идеале я хотел бы сделать что-то вроде следующего:
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()
метод, поскольку результаты зависят от информации в классе Chess, и
square.empty(chess)
не является реальным улучшением.
Причина, по которой у меня есть класс Square, заключается в том, что что-то вроде
square.up()
кажется намного приятнее, чем что-то вроде
[row, col + 1]
У вас есть предложение о том, как бы я выполнил вышесказанное?Какой-то способ написать класс внутри класса или что-то еще целиком?
РЕДАКТИРОВАТЬ:
Следуя советам likle и alex, я сделал следующее:
Я добавил контекстсвойство для Square Square
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);