Объявить свойство класса ES6 вне функции

Посмотрите, как x и y объявлены в конструкторе:

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}

есть способ объявить свойства вне функций, например:

class Point {
  // Declare static class property here
  // a: 22
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}

Итак, я хочу назначить значение 22, но я не уверен, могу ли я сделать это за пределами конструктора, но все еще внутри класса.

Ответ 1

Инициализация свойств непосредственно в классе в ES6 невозможен, в этом случае могут быть объявлены только методы. В ES7 действуют те же правила.

Однако это предлагаемая функция, которая может возникнуть после ES7 (в настоящее время на этапе 3). Вот официальное предложение .

Кроме того, синтаксис, предлагаемый предложением, немного отличается (= вместо :):

class Point {
  // Declare class property
  a = 22
  // Declare class static property
  static b = 33
}

Если вы используете Babel, вы можете использовать настройки этапа 3, чтобы включить эту функцию.

Здесь приведен пример Babel REPL


Другой способ сделать это в ES6, кроме как в конструкторе, - сделать это после определения класса:

class Point {
  // ...
}

// Declare class property
Point.prototype.a = 22;

// Declare class static property
Point.b = 33;

Здесь хороший поток SO, погружающийся в эту тему еще немного


Примечание:

В качестве Bergi, упомянутого в комментариях, предложенный синтаксис:

class Point {
  // Declare class property
  a = 22
}

- это просто синтаксический сахар, чтобы обеспечить ярлык для этого кода:

class Point {
  constructor() {
    this.a = 22;
  }
}

Если оба этих оператора присваивают свойству экземпляр.

Однако это не совсем то же самое, что присвоить прототипу:

class Point {
  constructor() {
    this.a = 22;  // this becomes a property directly on the instance
  }
}

Point.prototype.b = 33; // this becomes a property on the prototype

Оба будут доступны через экземпляр:

var point = new Point();
p.a // 22
p.b // 33

Но получение b потребует перехода на цепочку прототипов, тогда как a доступен непосредственно на объекте.

введите описание изображения здесь

Ответ 2

@nem035 прав, что он находится на стадии заявки.

Тем не менее, @nem035 suggestgetion - это один из способов добиться его как члена экземпляра класса.

//Объявляем свойство static class здесь

Кажется, вы хотите объявить статический член. Если да, JavaScript способ

class Point {
  // ...
}
Point.a = '22';

То, как вы ожидаете, можно сделать в TypeScript

class Point {
     static a = 22;
}

Скомпилированный вывод будет таким же, как в приведенном выше примере

Point.a = '22';