В предыдущем посте об объектно-ориентированном программировании на 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, более или менее прошу прощения