Класс в классе? - PullRequest
       15

Класс в классе?

0 голосов
/ 23 ноября 2018

В идеале я хотел бы сделать что-то вроде следующего:

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);

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Можно утверждать, что JavaScript не имеет полностью вложенных классов - у класса нет возможности использовать область родительского класса, например, и он не будет иметь смысла ни для чего, кроме свойств родительского класса (static объявлений), но класс в JavaScript - это просто объект, подобный любому другому, поэтому вы можете также определить его и сослаться на него со свойством другого класса:

class Chess {
}

Chess.Square = class {
};

Да, имяпоскольку класс необязателен.

Тогда вы можете делать такие вещи, как:

new Chess.Square();

И вообще все остальное, что вы делаете с классом или объектами класса.

0 голосов
/ 23 ноября 2018

В настоящее время нет вложенных классов .То, что вы могли бы сделать, это иметь два отдельных класса 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.

...