Добрый день! Сегодня мы продолжим рассматривать объекты и то, как ими можно пользоваться в Java-скрипте. В предыдущей лекции мы рассмотрели объекты, их свойства и обращение к этим свойствам — создание, удаление, проверка их существования, а сегодня мы рассмотрим использование функций в качестве свойств объекта. Это называется методы. Вы можете создать любое свойство и значением этого свойства сделать функцию. Это будет называться методом. Далее. Внутри этой функции у вас будет доступно ключевое свойство this. Про все его возможности и то, как оно работает, будет рассказано позднее. Сейчас вам важно знать то, что внутри метода объекта ключевое свойство this ссылается на сам этот объект и на все его внутренние свойства. Кроме этого, вы внутри методов через свойство this можете обращаться к вложенным свойствам этого объекта и таким образом выстраивать цепочку. И вы можете возвращать это значение из метода. Это очень удобно, и я вам покажу на примере чуть позже, какую это дает пользу по сравнению с невозвращением ничего из методов, которые должны что-то изменить во внутреннем состоянии объекта. Например, нам нужно сделать функцию, которая будет нам возвращать значение, количество лайков, наше внутреннее поле объекта. И вызываться она будет так: функция, которая будет устанавливать значение, будет называться следующим образом. Как мы видим, она возвращает нам после своего вызова, после того, как изменит внутреннее состояние и количество лайков на единицу, возвращает нам сам объект. Благодаря этому, мы можем выстраивать цепочку и повторно вызывать другие методы этого объекта. И в нашем случае заново получить количество лайков и узнать, что оно обновилось, и внутреннее состояние объекта действительно изменилось. Кроме этого, есть альтернативный функционал для создания методов объектов. Это называется геттеры и сеттеры. Вы описываете, что это будет: геттер для получения свойства или сеттер для установки свойства. А далее пишете имя свойства, которое будет использоваться для выставления этого значения. В нашем случае мы определили геттер для лайков и сказали, что это будет функция, которая будет возвращать внутреннюю переменную из объекта. Точно так же в этой внутренней функции имеется доступ к ключевому слову this, которое точно так же ссылается на весь объект. И, соответственно, сеттер, который будет изменять количество лайков и обрабатывать операцию присваивания для этого свойства. Используется это следующим образом: вы обращаетесь к свойству объекта ровно так же, как если бы это было просто статичное свойство, записанное в виде числа, но при этом вызывается функция. Для вас это совершенно прозрачно. А когда вы что-то присваиваете этому свойству, то, что находится справа от оператора присваивания, автоматически переходит аргументом в функцию сеттера. И вы уже устанавливаете свойства объекта через функцию-обработчик. Ну и, соответственно, после этого вы можете точно так же обратиться к свойствам значения и уже увидеть, что опять-таки внутреннее состояние объекта изменилось, и нужное вам значение было выставлено. Есть несколько шаблонов работы с ошибками, которые могут происходить в вашем коде и в коде, который использует ваш код. Вы можете явно обрабатывать различные внештатные ситуации и граничные условия или работать по так называемому контракту. Сказать, что моя функция будет принимать такой-то, такой-то, такой-то набор параметров. В том случае, если в нее будет передано что-то иное, она кидает исключения такого-то типа. А вы на своей стороне должны будете его обработать. И это будет выглядеть примерно так: точно тот же код, что у нас был раньше, но мы уже не занимаемся предположением, что нам передал пользователь, число или не число, а проверяем, что это число, и оно больше нуля. И если нет, то мы кидаем исключение. А, соответственно, код, который будет обрабатывать, использовать наш код, он должен будет обработать это исключение. Для этого используется оператор try и catch. Он состоит из двух блоков: блок try, внутри которого помещается тело кода, которое может бросить исключение, а далее идет блок catch, который принимает на вход исключение, которое будет выброшено, и позволит вам его обработать. Внутри этого кода очень удобно использовать оператор instanceof для проверки типа исключения, которое было выброшено. Таким образом, вы можете отделить известные вам ошибки, которые были задокументированы разработчиком, от других любых ошибок, синтаксиса или парсинга — неважно. И знать, что ошибка вот этого типа соответствует вот такому-то поведению библиотеки, которую вы используете. В нашем случае — некорректному переданному значению и тому, как нужно будет его обработать. Объект исключения содержит несколько полезных свойств, которые будут вам удобны для использования и для отладки. Прежде всего, свойство name, которое сообщает об имени типа ошибки; свойство message, которое содержит, собственно, само тело сообщения ошибки, которое посылает код, который выбрасывает исключения; и поле stack, которое содержит весь стек-трейс, весь порядок вызова функций, которые привели к исключению. В нем также содержится имя ошибки и сообщение ошибки. Мы рассмотрели методы объектов, функции, которые можно будет вызывать у объектов, мы рассмотрели геттеры и сеттеры для выставления динамических свойств объекта, а также мы рассмотрели обработку исключений как один из вариантов работы с внешними библиотеками. В следующей лекции мы рассмотрим сравнение различных типов данных в Java-скрипте и то, как оно происходит.