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