> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/c-functions/c3-classes/03-class-methods.md).

# 03. Class Methods

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

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

* `constructor() {}` - тело конструктора
* `static`-методы - статические функции, помеченные ключевым словом `static` являются свойствами самого класса и не записываются в свойство-`prototype`.
* Обычный метод будет доступен на всех экземплярах этого класса (записываются в свойство-`prototype` создаваемого объекта).

```javascript
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`.

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

## Static Functions

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

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

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