В предыдущем посте об объектно-ориентированном программировании на JavaScript в части 1 мы обсудили JavaScript ООП с использованием суперметодов. Если вы не читали его, посетите страницу Объектно-ориентированное программирование на JavaScript | Часть 1. В этом посте мы продолжим, давайте сразу к делу.

Геттер и сеттер в классе

Класс также поддерживает создание геттера и сеттера. Имейте в виду, что эти геттеры и сеттеры будут в прототипе, а не в экземпляре объекта.

Из приведенных выше результатов видно, что функция fullName находится в прототипе, а не в экземпляре объекта.

Поле класса

Обычно, когда мы хотим добавить поле (свойство, содержащее значение), мы добавляем его в конструкторе

Однако в EcmaScript есть предложение, в котором предлагается создать поле общедоступного класса для размещения вне конструктора на том же уровне, что и размещение метода.

В предложении также говорится, что EcmaScript будет поддерживать общедоступные и частные модификаторы доступа. Это предложение еще не окончательное, но некоторые браузеры уже поддерживают его. подробнее можно прочитать на https://github.com/tc39/proposal-class-fields

Поле общедоступного класса

Публичный означает, что к нему можно получить доступ извне класса, а к частному можно получить доступ только внутри класса.

Чтобы сделать общедоступное поле класса, мы можем напрямую создать имя поля со значением на том же уровне, что и метод.

Если мы не вводим значение в поле, это означает, что поле имеет неопределенное значение

class Customer {
  firstName;
  lastName;
  balance = 0;
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
}
const name = new Customer("Denis", "Listiadi");
console.info(name);

Поле закрытого класса

По умолчанию, когда мы добавляем поле, к нему можно получить доступ из любого места. Если мы хотим сделать приватное поле (доступное только внутри класса), мы можем использовать знак # перед именем поля.

Это называется закрытым полем класса, доступ к которому возможен только внутри класса.

Частный метод

Так же, как и поля, есть предложение добавить в EcmaScript функцию приватного метода.

Таким образом, модификатор доступа private можно использовать и в методах
Метод тот же, добавив знак # в начале метода, метод автоматически становится приватным

Имейте в виду, что эта функция все еще находится в зачаточном состоянии, а не является стандартом EcmaScript, поэтому, возможно, не все браузеры поддерживают эту функцию. подробнее можно прочитать на https://github.com/tc39/proposal-private-methods

Экземпляр оператора

Иногда бывают случаи, когда мы хотим проверить, является ли объект экземпляром определенного класса или нет.

Мы не можем использовать оператор typeof из-за объекта класса, если мы используем оператор typeof, результатом будет "объект"

Оператор instanceof возвращает логическое значение, true, если объект является экземпляром объекта, или false, если это не так.

class Employee {
}
class Manager {
}
const budi = new Employee();
const adi = new Manager();
console.info(budi instanceof Employee); // true
console.info(budi instanceof Manager); // false
console.info(adi instanceof Employee); // false
console.info(adi instanceof Manager); // true

оператор instanceof в классе наследования

Оператор instanceof поддерживает наследование классов, а это означает, что instanceof также можно использовать для проверки того, является ли объект экземпляром определенного класса или экземпляром определенного класса?

class Employee {
}
class Manager extends Employee {
}
const budi = new Employee();
const adi = new Manager();
console.info(budi instanceof Employee); // true
console.info(budi instanceof Manager); // false
// true because Manager is an inheritance from the Employee
console.info(adi instanceof Employee); // true
console.info(adi instanceof Manager); // true

Статическое поле класса

static — это ключевое слово, которое мы можем добавить перед полем или методом, обычно, когда мы создаем поле или метод, поле автоматически становится свойством в экземпляре объекта, а метод становится функцией в прототипе.
Если мы добавим статику, то этого не произойдет.

Если мы добавим static в поле класса, автоматически поле больше не принадлежит экземпляру объекта, а принадлежит самому классу.

Обычно static используется, если мы хотим создать служебное поле или функцию. Как получить доступ к статическому полю класса больше не через объект, а через класс

Поле статического класса можно интерпретировать как глобальное, независимо от того, где к нему осуществляется доступ или кто к нему обращается, результат будет одинаковым.

class Configuration {
  static name = "Learn JavaScript";
  static version = 1;
  static author = "Adi Kurniawan";
}
console.info(Configuration.name); // Learn JavaScript
console.info(Configuration.version); // 1
console.info(Configuration.author); // Adi Kurniawan

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

Ключевое слово static также можно добавить не только в поле, но и в метод

Если мы добавим его в метод, значит метод принадлежит классу, а не прототипу

И чтобы получить доступ к методу, мы также можем сделать что-то вроде доступа к статическому полю класса.

class MathUtil {
  static sum(...numbers) {
    let total = 0;
    for (const number of numbers) {
      total += number;
    }
    return total;
  }
}
const sum = MathUtil.sum(1,1,1,1,1);
console.info(sum); // 5

Ошибка

При создании приложения мы, конечно же, не избежим ошибки имени

В JavaScript ошибки стандартны. В JavaScript так много ошибок классов, но все классы ошибок в JavaScript всегда попадают в класс Error, а это означает, что класс Error является суперклассом для всех типов ошибок в JavaScript.

Примеры классов ошибок, встречающихся в JavaScript, включают SyntaxError, TypeError, EvalError и другие. подробнее см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#error_types

Выдать ошибку

Когда мы создаем экземпляр объекта из класса Error, это не приводит к ошибке автоматически.

Нам нужно сообщить нашей программе, что мы собираемся вызвать ошибку или выдать ошибку.

Чтобы выдать ошибку, мы можем использовать ключевое слово throw, за которым следует экземпляр объекта ошибки.

Если произойдет ошибка, наш программный код автоматически остановится, и мы сможем увидеть подробности ошибки в консоли в нашем браузерном приложении.

class MathUtil {
  static sum(...numbers) {
    if (numbers.length === 0) {
      throw new Error("Total parameters must be more than 0");
    }

    let total = 0;
    for (const number of numbers) {
      total += number;
    }
    return total;
  }
}
console.info(MathUtil.sum());
console.info(MathUtil.sum(1,1,1,1,1));

Таким образом, код перестанет работать, когда возникнет ошибка, из приведенного выше случая, когда первая ошибка консоли, вторая консоль не будет выполнена.

Обработка ошибок

Когда в программном коде JavaScript возникает ошибка, иногда мы не хотим, чтобы наша программа останавливалась.

В JavaScript мы можем отловить ошибку. Мы можем использовать оператор try-catch, чтобы поймать ошибку.

В блоке try мы попытаемся получить доступ к программному коду, который может вызвать ошибку, и в случае возникновения ошибки блок try остановится и автоматически войдет в блок catch. Если ошибки не возникнет, блок catch не будет выполнен.

Ключевое слово наконец

Иногда мы хотим что-то сделать, независимо от того, ошибка это или нет
В try-catch мы можем добавить блок finally. Этот блок finally всегда будет выполняться после завершения try-catch, независимо от того, произошла ошибка или нет, блок finally всегда будет выполняться.

try {  
  console.info(MathUtil.sum());  
  console.info("Code will stop");
} catch (error) {  
  console.error(`An error occurred: ${error.message}`);
} finally {
  console.info("Program code complete");

Попробуйте, наконец

Ключевое слово finally также можно использовать без использования catch. Обычно это используется в определенных случаях

Создание ошибки класса вручную

Несмотря на то, что в JavaScript уже есть стандартный класс Error
Но было бы неплохо выделить каждый тип ошибки

Создать свои ошибки вручную очень просто, просто создайте производный класс от класса Error

И не забудьте добавить параметр сообщения, чтобы его можно было передать в параметры в конструкторе класса Ошибка

Итерируемый и итератор

Одна из новейших функций ES6 — итерируемость. Iterables — это специальные объекты, которые стандартизированы.

Следуя стандартизации Iterable, мы можем автоматически перебирать данные, используя for…of

Примерами, которые соответствуют стандарту Iterable, являются строки, массивы, объекты и другие.

Как работают Iterable и Iterator

Если мы будем следовать контракту Iterable, то созданный нами объект можно будет повторить с помощью for…of

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

Может быть, это мой пост об объектно-ориентированном программировании на JavaScript, более или менее прошу прощения