Объявите свойство класса вне метода класса

Посмотрите, как 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, но я не уверен, смогу ли я сделать это вне конструктора, но все еще внутри класса ..

 somethinghere08 июл. 2016 г., 16:52
Я думаю, что вы могли бы использоватьstatic get x(){ return 5; }, что в конечном итоге делает то же самое, просто довольно многословно.

Ответы на вопрос(2)

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

// Объявляем свойство статического класса здесь

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

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

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

class Point {
     static a = 22;
}

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

Point.a = '22';
Решение Вопроса

невозможнотолько методы могут быть объявлены таким образом. Те же правила действуют и в 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;

Вотхорошо так нить погрузиться в эту тему еще немного

Заметка:

КакБерги Упомянутый в комментариях предложенный синтаксис:

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 доступен прямо на объекте.

 somethinghere08 июл. 2016 г., 16:56
Не могли бы вы просто использоватьstatic get x(){} также? Просто интересуюсь. В сущности, это то же самое, верно?
 nem03508 июл. 2016 г., 16:57
Ну, это не совсем тот же эффект, но может быть похожим. Ты можешь использоватьget чтобы получить постоянное значение или другое значение, объявленное в конструкторе, которое отличается от объявления значения, которое может быть непосредственно получено / установлено
 nem03509 июл. 2016 г., 21:44
@ Берги хорошая мысль, я добавил несколько дополнительных заметок к своему ответу
 Bergi09 июл. 2016 г., 13:20
Вы можете добавить этоa = 22 это не то же самое, что присвоение прототипу, но это очень запутанный сахар для создания свойств экземпляра в конструкторе.
 somethinghere08 июл. 2016 г., 17:00
Хм, правда. Ах, хорошо, слава богу, это единственный синтаксический сахар, и мы всегда можем положиться на большое наследие JS :)
 nem03508 июл. 2016 г., 17:03
Должен любить их прототипы :)

Ваш ответ на вопрос