** Статические методы, геттеры и сеттеры

Javascript — это ООП: объектно-ориентированный язык программирования (при программировании вместо процедурного написания кода тесно связанные элементы организуются в объекты так, чтобы объекты были совместимы друг с другом).

Класс — Blueprint (как шаблон)

Экземпляр — объекты, созданные по чертежам.

Сорт

  • Подъем (x) (можно использовать после объявления)
  • класс «тело» может быть запущен в «строгом режиме»
  • НЕТ возврата для «функции-конструктора»

Пример

Объект, созданный через «Класс», называется «Экземпляр объекта». Каждый экземпляр имеет уникальные атрибуты и методы (функции от объектов) класса.

«Новое» ключевое слово

Использование при создании «Экземпляра». Функция-конструктор выполняется немедленно, а экземпляр присваивается переменной. Когда экземпляр создается с помощью ключевого слова «Новый», экземпляр немедленно становится значением «этого».

class Car {
constructor(brand, name, color){
    this.brand = brand;
    this.name = name;
    this.color = color; }

drive(){
        console.log(this.name + 'starts to drive.');
    }
}

let avante = new Car('hyundai', 'avante', 'black')
    console.log(avante.color); // 'black'
    console.log(avante.drive()); // avante starts to drive.

// avante is a variable of Car Instance
// when we save 'class' at the variable', we use 'new' Keyword
// We generated Object Instance by using 'new' keyword (new Car)
// -> Constructor function has been executed immediately.
// -> avante (new object which has Class attributes) 

Статические методы

Ключевое слово static определяет статический метод или поле для класса или статический блок инициализации (см. ссылку для получения дополнительной информации об этом использовании). Статические свойства не могут быть напрямую доступны для экземпляров класса. Вместо этого доступ к ним осуществляется в самом классе.

class Animal {
  constructor(name) {
    this._name = name;
    this._behavior = 0;
  }

  static generateName() {
    const names = ['Angel', 'Spike', 'Buffy', 'Willow', 'Tara'];
    const randomNumber = Math.floor(Math.random()*5);
    return names[randomNumber];
  }
} 

console.log(Animal.generateName()); // Angel -> returns a name
// 'generateName' is a static method. Only return directly when accessed by Class.
const tyson = new Animal('Tyson'); 
tyson.generateName(); // TypeError
// TypeError because it accessed by 'Instance'
// Example of Static //
Math.pow();
Number.isFinite(1);
//-> No need to make Object. Return useful utility function //

Геттеры и сеттеры: свойство доступа

Свойства доступа представлены методами «геттер» и «сеттер». Это выглядит как переменная, как состояние класса, но на самом деле относится к «функции».

Если вы хотите использовать его как доступ к общему свойству, используйте «свойство доступа», присоединив get и set

Getter — это метод, который используется для получения значения свойства. Синтаксис метода получения: get methodName(){…}

Setter – это метод, который используется для установки значения свойства. Синтаксис для представления метода установки: -set MethodName(value){…}

let obj = {
  get propName() {
    // getter, excute 'obj.propName'
  },

  set propName(value) {
    // setter, excute 'obj.propName = value'
  }
};



// Getter Example //
let user = {
  name: "John",
  surname: "Smith",

  get fullName() {
    return `${this.name} ${this.surname}`;
  },
  fullName2(){
    return `${this.name} ${this.surname}`;
  }
};

alert(user.fullName); // John Smith
alert(user.fullName2()); // John Smith






// Setter Example //
let user = {
  name: "John",
  surname: "Smith",

  get fullName() {
    return `${this.name} ${this.surname}`;
  }
  
  set fullName(value) {
    [this.name, this.surname] = value.split(" ");
  }
};

// Execute 'set fullName' with the value(Alice Special)
user.fullName = "Alice Special"

alert(user.fullName); // Alice Special
alert(user.name); // Alice
alert(user.surname); // Special



// Getter + Setter Example //
let user = {
  get name() {
    return this._name;      // to generate 'getter method', add _ right before the 'varaiable name'
  },

  set name(value) {
    if (value.length < 4) {
      alert("The name is too short. Make the name in 4 letters.");
      return;
    }
    this._name = value;
  }
};

user.name = "Pete";
alert(user.name); // Pete

user.name = ""; // name is too short

получить user.fullName -> Использование .

set user.fullName=’Alice Specil’ -> Использование =