03. Class Methods

Тело класса может содержать только методы, но не данные. Классы не могут иметь статические данные.

Тело класса может содержать функции трех видов:

  • constructor() {} - тело конструктора

  • static-методы - статические функции, помеченные ключевым словом static являются свойствами самого класса и не записываются в свойство-prototype.

  • Обычный метод будет доступен на всех экземплярах этого класса (записываются в свойство-prototype создаваемого объекта).

class Foo {
  constructor(prop) {
    this.prop = prop;
  }
  static staticMethod() {
    return "classy";
  }
  prototypeMethod() {
    return "prototypical";
  }
}

let foo = new Foo(123);

Методы, объявленные внутри class имеют ряд особенностей:

  • Методы являются именно методами, то есть имеет доступ к super и this.

  • Все методы класса работают в режиме use strict, даже если он не указан.

  • Все методы класса не перечислимы. То есть в цикле for..in по объекту их не будет.

  • В классах, как и в обычных объектах, можно объявлять геттеры и сеттеры через get/set, а также использовать [field] для свойств с вычисляемыми именами.

  • В теле класса нельзя описать его поля, только в конструкторе. Дело в том, что определения в теле класса попадают в его прототип, а там должны быть только функции.

  • Можно объявлять статические функции классов, используя ключевое слово static.

Class Constructor

Псевдо-функция constructor соответствует поведению функции-конструктора из ES5:

  • Функция constructor запускается при создании объекта при помощи new.

  • Если конструктор не указан, то используется пустая функция.

  • Как и в обычных конструкторах, this в теле конструктора ссылается на создаваемый объект.

  • Можно подменить возвращаемое значение, указав явное значение return.

// Foo is constructor
> Foo === Foo.prototype.constructor
true
> typeof Foo
'function'

Static Functions

Метод, объявленный с ключевым словом static объявляется на самой функции конструкторе, а не на прототипе.

Классы не могут иметь полей или статических данных в своем объявлении, но их можно добавить после определения, либо использовать функции-геттеры.

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  static get ZERO() {
    return new Point(0, 0);
  }
}
Point.ONE = new Point(1, 1);

Last updated